用std :: set替代BOOST_FOREACH?

时间:2011-10-24 18:53:05

标签: c++ boost stl

当你想迭代std :: set时,BOOST_FOREACH的最佳替代方法是什么?

当我尝试做一个似乎是一个合理的方法来迭代一个集合时,我得到了编译错误。这段代码:

set<string> nameSet;
string aName;
BOOST_FOREACH(nameSet, aName) {
  cout << aName << endl;
}

使用gcc 4.4.3生成此编译错误:

error: no match for ‘operator=’ in ‘nameSet = boost::foreach_detail_::deref [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, C = mpl_::bool_<false>](((const boost::foreach_detail_::auto_any_base&)((const boost::foreach_detail_::auto_any_base*)_foreach_cur70)), 0u)’

根据this link,两者不兼容,因为std :: set :: iterator必须允许它所引用的值的变异。

我可以想到一些火腿捏造的方法,但我想知道是否有更简洁的方法来迭代集合。

1 个答案:

答案 0 :(得分:7)

适合我。也许你有BOOST_FOREACH的参数反转。

#include <set>
#include <string>
#include <iostream>
#include <boost/foreach.hpp>

int main(int ac, char **av) {

  std::set<std::string> nameSet(av+1, av+ac);

  BOOST_FOREACH(const std::string& aName, nameSet) {
    std::cout << aName << "\n";
  }

  BOOST_FOREACH(std::string aName, nameSet) {
    std::cout << aName << "\n";
  }

  std::string aName;
  BOOST_FOREACH(aName, nameSet) {
    std::cout << aName << "\n";
  }
}

<小时/>

  

根据this link,两者不兼容,因为std :: set :: iterator必须允许它所引用的值的变异。

那不是那个链接所说的。你不能做什么,以及那个链接说不起作用的是:

BOOST_FOREACH(std::string& aName, nameSet) {
}

因为您无法从const表达式形成非const引用。 (即,std::set的每个const成员。)