C中的表格有两个不同吗?

前端之家收集整理的这篇文章主要介绍了C中的表格有两个不同吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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(在工作中).

我避免像瘟疫修改我正在迭代的容器,当我需要过滤/删除元素时更喜欢依赖STL算法……否则很容易搞乱边界条件和迭代器失效.

原文链接:https://www.f2er.com/c/117721.html

猜你在找的C&C++相关文章