当你想迭代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必须允许它所引用的值的变异。
我可以想到一些火腿捏造的方法,但我想知道是否有更简洁的方法来迭代集合。
答案 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成员。)