是否可以将boost :: foreach与std :: map一起使用?

Tho*_*ini 52 c++ foreach boost

我发现boost :: foreach非常有用,因为它为我节省了大量的文字.例如,假设我要打印列表中的所有元素:

std::list<int> numbers = { 1, 2, 3, 4 };
for (std::list<int>::iterator i = numbers.begin(); i != numbers.end(); ++i)
   cout << *i << " ";
Run Code Online (Sandbox Code Playgroud)

boost :: foreach使上面的代码变得更加简单:

std::list<int> numbers = { 1, 2, 3, 4 };
BOOST_FOREACH (int i, numbers)
   cout << i << " ";
Run Code Online (Sandbox Code Playgroud)

好多了!然而,我从来没有想过将它用于std::maps 的方法(如果可能的话).该文档仅包含类型为vector或的示例string.

GMa*_*ckG 88

你需要使用:

typedef std::map<int, int> map_type;
map_type map = /* ... */;

BOOST_FOREACH(const map_type::value_type& myPair, map)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

原因是宏需要两个参数.当您尝试内联对定义时,引入第二个逗号,改为使用宏三个参数.预处理器不尊重任何C++构造,它只知道文本.

所以当你说BOOST_FOREACH(pair<int, int>, map),预处理器看到宏的这三个参数:

1. pair<int
2. int>
3.map

哪个错了.这在for-each文档中提到.


Man*_*uel 20

我使用Boost的Range Ex库,它实现了一些奇特的范围适配器,用于迭代映射键或值.例如:

map<int, string> foo;
foo[3] = "three";
foo[7] = "seven";

BOOST_FOREACH(i, foo | map_keys)
   cout << i << "\n";


BOOST_FOREACH(str, foo | map_values)
   cout << str << "\n";
Run Code Online (Sandbox Code Playgroud)