BOOST_FOREACH与for循环

时间:2013-02-21 10:46:24

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

我想就BOOST_FOREACH的使用提出建议。

我已经读过它并不是真的建议在性能方面是一个非常重的标题。

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

当然,优点是您不直接处理迭代器,这样可以简化迭代容器的任务。

你怎么看? 您是否认为如果使用它应该系统地采用以保证项目的同质性或仅在某些情况下建议使用它?

3 个答案:

答案 0 :(得分:20)

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

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

我从未发现我需要在++ 03中使用它。

注意当使用基于范围的循环对具有昂贵复制元素的容器或在通用上下文中时,最好对这些元素使用const&

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

同样,如果您需要修改容器的元素,请使用非const&amp; amp; (auto& elem : v)。

答案 1 :(得分:8)

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

你对休息和继续的担忧是没有根据的,可能适得其反。对于C ++ 03的传统长for循环头,人们倾向于读取循环头并忽略隐藏在循环头中的任何条件变量。最好通过break和continue来明确你的意图。

如果您决定使用boost foreach,请系统地使用它。毕竟它应该被用来取代面包和黄油圈。

答案 2 :(得分:2)

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

BTW - “重头”不会影响程序的性能,只会影响编译时间。