cod*_*ack 13 c++ boost for-loop boost-foreach
我想就BOOST_FOREACH的使用提出建议.
我已经读过它并不是真的建议在性能方面是一个非常重的标题.
此外,它强制使用"break"和"continue"语句,因为你不能真正拥有由布尔驱动的退出条件,并且我总是被告知应该尽可能避免"break"和"continue".
当然,优点是您不直接处理迭代器,这样可以简化迭代容器的任务.
你怎么看待这件事 ?您是否认为如果使用它应该系统地采用以保证项目的同质性或仅在某些情况下建议使用它?
jua*_*nza 21
我会说基于C++范围的循环取代它.这相当于这个BOOST_FOREACH示例:
std::string hello( "Hello, world!" );
for (auto c : hello)
{
std::cout << c;
}
Run Code Online (Sandbox Code Playgroud)
我从来没有发现我需要在++ 03中使用它.
注意当使用基于范围的循环对具有昂贵复制元素的容器或在通用上下文中时,最好使用const&这些元素:
SomeContainerType<SomeType> v = ....;
for (const auto& elem : v)
{
std::cout << elem << " ";
}
Run Code Online (Sandbox Code Playgroud)
同样,如果您需要修改容器的元素,请使用非const&(auto& elem : v).
在编程中,清晰度是特朗普.我总是在C++ 03中使用boost foreach,发现它比手写循环更具可读性,标题大小不会杀死你.正如@juanchopanza正确指出的那样,这个问题在C++ 11中已经过时了.
你对休息和继续的担忧是没有根据的,可能适得其反.对于传统的C++ 03的长循环标头,人们往往不会读取循环标头并忽略隐藏在循环标头中的任何条件变量.最好通过break和continue来明确你的意图.
如果您决定使用boost foreach,请系统地使用它.毕竟它应该被用来代替面包和黄油的循环.
我刚刚用一个简单的 for 循环替换了 BOOST_FOREACH 的使用,并获得了 50% 的加速,所以我想说它绝对并不总是最好的使用方式。您也不会获得有时您实际需要的循环计数器(例如“i”)。就我个人而言,我不是粉丝,但 YMMV 如果它更适合你的风格。
顺便说一句 - “重标头”不会影响程序的性能,只会影响编译时间。