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)
没有魔法,但它提出了一个问题:a
是否曾在循环中修改过,结束边界可能会发生变化?
2/改进
vector<int>::iterator end = a.end();
for(vector<int>::iterator it = a.begin(); it != end; ++it)
a.end()
似乎只执行一次。然而,由于 end
不是 const
,它可能在循环内被修改。
此外,它在外部作用域中引入了 end
标识符,污染了它。
因此,在性能上有潜在的提升,但在清晰度上没有太大提升。而且,它更加冗长。
我会提出其他几种方式:
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 range-for 语句
for (int& i: a)
所有优点:
- 非常简洁
- 与最好的 C++ 手写循环一样高效
- 保证完整迭代,不问任何问题
而且没有任何问题(范围泄漏、预处理器魔法)。
就我个人而言,我尽可能使用 C++11 range-for(业余项目),否则使用 BOOST_FOREACH
(在工作中)。
我避免像瘟疫一样修改我正在迭代的容器,当我需要过滤/删除元素时更喜欢依赖 STL 算法......否则很容易搞乱边界条件和迭代器失效。
关于c++ - C++中的两种形式有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10346287/