BOOST_FOREACH
和c++11基于范围的循环主要区别是什么?- 是否存在一种特殊情况,我需要使用
BOOST_FOREACH
而不是基于范围的循环或反之亦然?
在使用填充有1,000,000个int变量的std :: vector进行了小规模测试后,发现BOOST_FOREACH
比基于范围的循环略慢(用了大约1.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
在新代码中还有用处。我认为它只在旧代码中有用,在出现范围循环之前。 - Mooing DuckBOOST_FOREACH
吗? - Barry