c++ - 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)

没有魔法,但它提出了一个问题: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/

相关文章:

c# - 在 Windows 上获取 cpu % 使用率和网络吞吐量的最有效和最基本的方法?

c++ - 如何减少 Qt 布局内小部件之间的差距

c++ - MySQL 和 C 应用程序

c++ - 如何使用 clang 和 distcc 在不同架构的从机上编译(例如 Mac/Linux)

c++ - 删除完整的类类型会导致未定义的行为吗?

c++ - Quantlib 1.5 构建

c++ - 数组订阅 : returning Reference vs proxy class method

c++ - 在编译时确定指针类型

c++ - 如何将函数放置在 C 中的特定地址?

c++ - 排序存储在 vector 中的日期(字符串)