【问题标题】:BOOST_FOREACH versus for loopBOOST_FOREACH 与 for 循环
【发布时间】:2013-02-21 10:46:23
【问题描述】:

关于BOOST_FOREACH 的用法,我想听听您的建议。

我已经阅读了它,因为它是一个非常沉重的标题,但实际上并不推荐它。

此外,它强制使用“break”和“continue”语句,因为您不能真正拥有由布尔值驱动的退出条件,而且我一直被告知应该避免使用“break”和“continue”尽可能。

当然,优点是您不直接与迭代器打交道,这简化了迭代容器的任务。

你怎么看?

您认为如果使用它应该系统地采用以保证项目中的同质性,还是仅在某些情况下才推荐使用它?

【问题讨论】:

  • "而且我一直被告知应该尽可能避免使用 "break" 和 "continue"。"你能详细说明一下吗?
  • IIRC 在过去人们没有 RAII 模式并且优化器可能会在循环变得过于“跳跃”时遇到问题时,有理由避免中断并继续。那是“单进单出”教条的时代,函数只有一个返回语句、大量的 if 和一些 goto。有些人在很久以前就学会了这些教条,从未质疑过它们,并在它们没有任何意义但会带来很多麻烦的时候将它们传播给年轻人。
  • 虽然我同意你的观点,但我不得不说,在 for 循环中不使用 break 或 continue 可能是有价值的。如果您将这些关键字保留给 while 循环并同意不在 for 循环中使用它们,则意图变得更加清晰。但恕我直言,这太过分了,我不建议这样做。

标签: c++ boost for-loop boost-foreach


【解决方案1】:

我会说基于 C++ 范围的循环取代了它。这相当于this BOOST_FOREACH example

std::string hello( "Hello, world!" );
for (auto c : hello)
{
  std::cout << c;
}

我从来没有发现我需要在 ++03 中使用它。

注意在复制元素成本高昂的容器上使用基于范围的循环时,或在通用上下文中,最好对这些元素使用const&amp;

SomeContainerType<SomeType> v = ....;
for (const auto& elem : v)
{
  std::cout << elem << " ";
}

同样,如果你需要修改容器的元素,那么使用非常量 & (auto&amp; elem : v)。

【讨论】:

  • 我认为你应该在大多数情况下使用 [const] auto& - 否则你会得到一个副本
  • 更详细的描述:msdn.microsoft.com/en-us/library/vstudio/dd293667.aspx(引用和 cv-qualifiers)
  • @Daniel 是的,但是在他的情况下,我们只有一个 chars,我正在尝试编写与 BOOST_FOREACH 示例等效的内容。
  • 并不是对您的答案的真正批评 - 只是一个扩展,因为很多人在使用 auto 时会感到困惑
  • @Daniel 我为此添加了一条注释。
【解决方案2】:

在编程中,清晰是王牌。我一直在 C++03 中使用 boost foreach,发现它比手写循环更具可读性,标题大小不会杀死你。正如@juanchopanza 正确指出的那样,当然,这个问题在 C++11 中已经过时了。

您对 break 和 continue 的担忧是没有根据的,而且可能会适得其反。对于 C++03 传统上较长的 for 循环标头,人们倾向于阅读循环标头并忽略隐藏在循环标头中的任何条件变量。最好使用 break 和 continue 明确您的意图。

如果您决定使用 boost foreach,请系统地使用它。毕竟,它应该是用来代替面包和黄油循环的。

【讨论】:

    【解决方案3】:

    我刚刚用一个简单的 for 循环替换了 BOOST_FOREACH 的使用,并获得了 50% 的加速,所以我想说这绝对不是最好的使用方法。 您也不会得到有时您实际需要的循环计数器(例如“i”)。就我个人而言,我不是 YMMV 的粉丝,如果它更适合你的风格的话。

    顺便说一句 - “重头文件”不会影响程序的性能,只会影响编译时间。

    【讨论】:

    • 您能否分享一下实际的代码示例:之前,之后?魔鬼就是细节
    • @Niki 好点,但现在太早了(是的,我检查了我的版本控制系统,但找不到那个变化)。
    猜你喜欢
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2011-07-12
    • 2012-11-04
    • 2017-07-09
    • 1970-01-01
    相关资源
    最近更新 更多