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

Lau*_*kas 12 c++ foreach boost c++11

  1. BOOST_FOREACH基于和c ++ 11范围的循环之间的主要区别是什么?
  2. 是否存在我想要使用的特定情况BOOST_FOREACH而不是基于范围的循环,反之亦然?

在执行了一个std::vector带有1,000,000个int变量的小测试之后,我发现它BOOST_FOREACH比基于范围的循环慢一点(比基于范围的循环花了大约1.25倍).

Bar*_*rry 21

主要的区别在于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
}
Run Code Online (Sandbox Code Playgroud)

相比于:

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

我喜欢你可以把它tie直接放到循环标题中,虽然最终这是一个很小的优势,甚至不值得考虑这是一个决定.使用范围为.总是.


C++ 17将引入结构化绑定,这甚至可以消除那些次要的语法优势:

for (auto const& [key, value] : m)
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

那时,没有任何理由可以使用BOOST_FOREACH.