2013-02-21 143 views
11

我想征求关于BOOST_FOREACH使用的建议。BOOST_FOREACH与for循环

我已经读过它并不是真的建议在性能是一个非常沉重的头。

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

当然,优点是你不直接处理迭代器,它可以缓解遍历容器的任务。

您对此有何看法? 您是否认为如果使用它应该被系统地采用来保证项目中的同质性或者仅在某些情况下推荐使用它?

+4

“我总是被告知应尽可能避免”休息“和”继续“。”你能精心准备吗? – utnapistim 2013-02-21 10:49:52

+8

IIRC有理由避免中断,并且在人们没有RAII模式的好时代继续回来,并且当循环会变得太“跳跃”时optmimizer可能会出现问题。那些是“单一进入单一退出”教条的日子,其中函数只有一个返回语句,多个if和一些goto。还有一些人在以前学过这些教条,从来没有质疑过他们,并且在他们没有任何意义但很麻烦的时候将它们传播给年轻人。 – 2013-02-21 11:07:29

+0

虽然我同意你的看法,但我必须说,在循环中不使用break或continue可能是有价值的。 如果您在while循环中保留这些关键字并同意不将它们用于for循环,则意图会变得更清晰。但这只是太多恕我直言,我不会建议。 – MatiasFG 2014-12-10 12:58:58

回答

18

我会说基于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 &(auto& elem : v)。

+0

我认为你应该使用[const] auto&大部分时间 - 否则你会得到一个副本 – Daniel 2013-02-21 11:41:35

+0

更详细的描述:http://msdn.microsoft.com/en-us/library/vstudio/dd293667.aspx(References and cv - 限定符) – Daniel 2013-02-21 11:47:31

+0

@Daniel是的,但在他的情况下,我们有单个'char's,并且我正在尝试写入'BOOST_FOREACH'示例的等价物。 – juanchopanza 2013-02-21 11:58:49

7

在编程中,清晰度是王道。我一直在C++ 03中使用boost foreach,发现它比手写循环更可读,头文件的大小不会让你失望。正如@juanchopanza正确指出的,当然,这个问题在C++ 11中已经过时了。

你对打破和继续的关注是毫无根据的,可能适得其反。使用C++ 03的传统长循环头文件,人们倾向于而不是读取循环头并忽略隐藏在循环头中的任何条件变量。更好地让你的意图明确,并继续。

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

0

我刚刚用一个简单的for循环替换了BOOST_FOREACH的一个用法,得到了50%的加速,所以我会说这肯定不总是最好用的。 你也不会得到有时你真正需要的循环计数器(例如“我”)。就我个人而言,如果它更适合你的风格,我不是粉丝,而是YMMV。

顺便说一句 - “沉重的标题”不会​​影响程序的性能,只会影响编译时间。