C++ BOOST_FOREACH与for loop的对比

C++ BOOST_FOREACH与for loop的对比,c++,boost,for-loop,boost-foreach,C++,Boost,For Loop,Boost Foreach,我想听听您对使用BOOST\u FOREACH的建议 我已经读过很多书了,它的性能是一个很重的标题,所以不推荐使用 此外,它还强制使用“break”和“continue”语句,因为您不可能真正拥有由布尔值驱动的退出条件,而且我一直被告知在可能的情况下应该避免使用“break”和“continue” 当然,优点是您不直接处理迭代器,而迭代器简化了遍历容器的任务 你觉得怎么样 你认为如果使用它,应该系统地保证一个项目的同质性,还是只在某些情况下推荐它的使用?< /P> < P>我认为C++范围的循环

我想听听您对使用
BOOST\u FOREACH
的建议

我已经读过很多书了,它的性能是一个很重的标题,所以不推荐使用


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

当然,优点是您不直接处理迭代器,而迭代器简化了遍历容器的任务

你觉得怎么样


你认为如果使用它,应该系统地保证一个项目的同质性,还是只在某些情况下推荐它的使用?< /P> < P>我认为C++范围的循环可以取代它。这相当于:


类似地,如果需要修改容器的元素,则使用非常量(
auto&elem:v
)。

在编程中,清晰性是最重要的。我一直在C++03中使用boost foreach,发现它比手写循环可读性好得多,头的大小不会影响你。当然,@juanchopanza正确地指出,这个问题在C++11中已经过时了

你对中断和继续的担忧是没有根据的,可能会适得其反。传统上,C++03的循环头很长,人们往往不读取循环头,而忽略隐藏在循环头中的任何条件变量。最好用中断和继续来明确你的意图


如果您决定使用boostforeach,请系统地使用它。毕竟,它应该用来取代面包和黄油循环。

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


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

“我一直被告知,在可能的情况下,应该避免“中断”和“继续”你能解释一下吗?IIRC在过去的好日子里,人们没有RAII模式,当环路变得太“跳跃”时,OPTMimizer可能会遇到问题,所以有理由避免中断并继续。那是“单输入单输出”教条的时代,函数只有一个返回语句,大量的if和一些goto。有些人在亿万年前就学会了这些教条,从来没有质疑过这些教条,并且在这些教条毫无意义但却有很多麻烦的时候将它们传播给年轻人。虽然我同意你的观点,但我不得不说,不使用“中断”或“继续”循环是有价值的。如果您将这些关键字保留给while循环,并同意不在for循环中使用它们,那么意图就会更清楚。但是这太过分了,我不建议你这么做。我认为你应该在大多数情况下使用[const]auto&否则你会得到一份更详细的描述:(参考资料和简历限定符)@Daniel是的,但在他的情况下,我们有单
char
s,我试着写一个相当于
BOOST\u FOREACH
的例子。这并不是对你的答案的批评,只是一个扩展,因为很多人在使用auto@Daniel我添加了一个关于这一点的注释。你能分享一下实际的代码示例:before,after吗?魔鬼就是魔鬼details@Niki这一点很好,但现在已经太久了(是的,我检查了我的版本控制系统,但找不到更改)。
std::string hello( "Hello, world!" );
for (auto c : hello)
{
  std::cout << c;
}
SomeContainerType<SomeType> v = ....;
for (const auto& elem : v)
{
  std::cout << elem << " ";
}