BOOST_FOREACH
和基于c ++ 11范围的循环之间的主要区别是什么? BOOST_FOREACH
而不是基于范围的循环的特定情况,反之亦然?在std::vector
填充1,000,000 int
个变量执行一点测试后,我发现BOOST_FOREACH
比基于范围的循环稍微慢一点(花费的时间比一个变量大约1.25倍)基于范围的循环)。
答案 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循环没有提供类似的功能。