【问题标题】:alternative to BOOST_FOREACH with std::set?用 std::set 替代 BOOST_FOREACH?
【发布时间】:2011-10-24 18:53:05
【问题描述】:

当您想要迭代 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 分。请在您的问题中发布完整的、最少的程序——否则我们必须为您编写代码。见sscce.org

标签: c++ boost stl


【解决方案1】:

为我工作。也许您将 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 表达式形成非常量引用。 (即,std::set 的每个 const 成员。)

【讨论】:

    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    相关资源
    最近更新 更多