基于范围的循环的BOOST_FOREACH和c ++ 11之间的区别?

时间:2014-11-19 21:47:39

标签: c++ c++11 boost foreach

  1. BOOST_FOREACH和基于c ++ 11范围的循环之间的主要区别是什么?
  2. 是否存在我希望使用BOOST_FOREACH而不是基于范围的循环的特定情况,反之亦然?
  3. std::vector填充1,000,000 int个变量执行一点测试后,我发现BOOST_FOREACH比基于范围的循环稍微慢一点(花费的时间比一个变量大约1.25倍)基于范围的循环)。

2 个答案:

答案 0 :(得分:20)

主要区别在于range-for是一种语言结构,而BOOST_FOREACH是一个宏,它在幕后做了很多魔术来做一些看起来像语言结构的东西。它试图在前C ++ 11的限制下做同样的事情。 BOOST_FOREACH 的目标是范围。

有一种情况我甚至会考虑使用BOOST_FOREACH而不是range-for,它会迭代一个元组的容器,你想要展开元组:

std::map<int, int> m;
int key, value;
BOOST_FOREACH(boost::tie(key, value), m)
{
    // do something with key and value here
}

与:相比:

int key, value;
for (const auto& pair : m) 
{
    std::tie(key, value) = pair;
    // do something
}

我喜欢你可以将tie直接放入循环标题中,尽管最终这是一个小优势,即使将此视为决定也几乎不值得。使用范围为。总是。


C ++ 17将引入structured bindings,它甚至可以消除那些次要的语法优势:

for (auto const& [key, value] : m)
{
    // do something
}

此时,没有理由使用BOOST_FOREACH

答案 1 :(得分:0)

boost提供BOOST_REVERSE_FOREACH,它使您可以向后遍历容器。 for ranged循环没有提供类似的功能。