vector<int> a;
1.
for(vector<int>::iterator it = a.begin(); it != a.end(); ++it)
2.
vector<int>::iterator end = a.end(); for(vector<int>::iterator it = a.begin(); it != end; ++it)
哪个更有效?或者相同?
解决方法
最初的批评:
1 /典型教程示例
for(vector<int>::iterator it = a.begin(); it != a.end(); ++it)
没有魔法,但它提出了一个问题:在循环中是否曾经修改过,结束界可能会有所不同?
2 /改进
vector<int>::iterator end = a.end(); for(vector<int>::iterator it = a.begin(); it != end; ++it)
似乎a.end()只执行一次.但是,由于end不是const,因此可以在循环内修改.
此外,它在外部范围中引入了结束标识符,从而对其进行了污染.
因此,性能可能会有所提升,但清晰度并不高.而且,它更冗长.
我会提出其他几种方法:
3 /最佳手册
for(vector<int>::iterator it = a.begin(),end = a.end(); it != end; ++it)
结合v1(非常简洁,没有外部范围污染)和v2(性能)的优点,但是仍然不清楚是否在循环体内修改了末端.
4 /升压驱动
BOOST_FOREACH(int& i,a)
甚至比v1还要严格,一眼就能识别,没有外部范围泄漏,并保证完全迭代(不可能修改边界).
不幸:
>变量类型中存在逗号问题(因为它依赖于预处理器)
>编译时错误完全神秘(因为它依赖于预处理器)
注意:理论上,人们可以在这里使用std :: foreach算法的情况,但老实说……在外部定义谓词时涉及太多的工作并且它破坏了代码局部性.
5 / C 11范围 – 声明
for (int& i: a)
所有优点:
>极端的Terse
>作为最好的C手写循环的高性能
>保证完整迭代,没有问题
并没有任何问题(范围泄漏,预处理器魔术).
就我个人而言,无论什么时候我都可以使用C 11范围(业余爱好项目),否则我会使用BOOST_FOREACH(在工作中).