BOOST_FOREACH和C++11范围for循环的区别是什么?

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

在使用填充有1,000,000个int变量的std :: vector进行了小规模测试后,发现BOOST_FOREACH比基于范围的循环略慢(用了大约1.25倍的时间)。


我不确定boost::foreach在新代码中还有用处。我认为它只在旧代码中有用,在出现范围循环之前。 - Mooing Duck
你是指 BOOST_FOREACH 吗? - Barry
@Barry 是的,我有。让我编辑一下。 - Laurynas Lazauskas
2个回答

25

主要区别在于range-for是语言结构,而BOOST_FOREACH是一个宏,在底层执行许多魔术以实现与该语言结构类似的功能。它试图以pre-C++11的限制条件做到完全相同的事情。 BOOST_FOREACH的目标就是range-for。

只有一种情况,我才会考虑使用BOOST_FOREACH,那就是在迭代包含元组的容器时需要展开元组:

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放入循环头中,尽管这对于决策来说几乎不值得考虑,因为它只是一个微小的优势。请使用范围for循环。始终如此。


C++17引入了结构化绑定,甚至消除了这个微小的语法优势:

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

目前完全没有理由使用 BOOST_FOREACH


哪个更好?我正在做一个项目,这个项目使用了 boost,但他们只用 foreach。我用 boost 替换了 foreach 部分,并使用标准的 for 循环进行了更正。我认为这是不必要的。你有什么想法? - Fatih Mert Doğancan
1
@FatihMertDoğancan,是的,请使用标准语言循环。 - Barry

1
boost提供BOOST_REVERSE_FOREACH,允许您反向遍历容器。for循环范围不提供类似的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接