alternative to BOOST_FOREACH with std::set?

alternative to BOOST_FOREACH with std::set?

本文关键字:std set with FOREACH to BOOST alternative      更新时间:2023-10-16

当您想迭代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)’

根据这个链接,这两者是不兼容的,因为std::set::iterator必须允许它所指向的值发生变化。

我可以想到一些笨拙的方法,但我想知道是否有一种更干净的方法来遍历集合。

适合我。也许你把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";
  }
}


根据这个链接,这两者是不兼容的,因为std::set::iterator必须允许它所指向的值发生变化。

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

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

因为不能从const表达式形成非const引用。(即每个std::set的const成员)