【问题标题】:Difference between BOOST_FOREACH and c++11 for range based loop?基于范围的循环的 BOOST_FOREACH 和 c++11 之间的区别?
【发布时间】:2014-11-19 21:47:39
【问题描述】:
  1. BOOST_FOREACH 和 c++11 基于范围的循环之间的主要区别是什么?
  2. 是否存在我想要使用BOOST_FOREACH 而不是基于范围的循环或反之亦然的特定情况?

在使用填充有 1,000,000 个int 变量的std::vector 执行小测试后,我发现BOOST_FOREACH 比基于范围的循环慢一点(比基于范围的循环长约1.25 倍)。

【问题讨论】:

  • 我不确定boost::foreach 在新代码中是否有用。我认为它只在旧代码中有用,在基于范围的循环之前。
  • 你的意思是BOOST_FOREACH
  • @Barry 是的,我愿意。让我编辑一下。

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


【解决方案1】:

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

在一种情况下,我什至会考虑使用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

【讨论】:

  • 哪个更好?我正在做一个项目,该项目包括boost,但他们只是使用了foreach。我使用 boost 删除了 foreach 部分,并使用标准 for 循环更正了它们。我认为这是不必要的。你在想什么?
  • @FatihMertDoğancan 是的,使用标准语言 for loop。
【解决方案2】:

boost 提供 BOOST_REVERSE_FOREACH 允许您向后遍历容器。 for ranged 循环不提供类似的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多