C ++ 11基于范围的循环效率“const auto&i”与“auto i”

在C ++ 11中,我可以像这样迭代一些容器:

for(auto i : vec){ std::cout << i << std::endl; } 

但是我知道这是毫无必要的,因为我只需要打印 vec的值就可以得到vec每个元素的副本,所以我可以这样做:

 for(auto &i : vec){ std::cout << i << std::endl; } 

但是我想确保vec的值永远不会被修改,并遵守const的正确性,所以我可以这样做:

 for(const auto &i : vec){ std::cout << i << std::endl; } 

所以我的问题是:如果我只需要看一些容器的值,不会最后一个循环( const auto &i )总是首选,因为没有额外的副本效率提高( 编辑 :每个元素的) vec

我有一个我正在开发的程序,我正在考虑在整个过程中进行这样的改变,因为效率是非常关键的(我在第一个地方使用C ++的原因)。

是。 同样的原因,如果你只读过你参数const&的参数。

 T // I'm copying this T& // I'm modifying this const T& // I'm reading this 

这些是你的“默认”。 当T是一个基本types(内置)时,通常你只是回到const T (无参考)进行读取,因为副本比别名更便宜。


我有一个我正在开发的程序,我正在考虑在整个过程中进行这种改变,因为效率是非常关键的

  1. 不要盲目的改变。 一个工作程序比一个快速但破碎的程序要好。
  2. 你如何遍历你的循环可能不会有太大的区别; 你正在循环的原因,不是吗? 你的循环的身体将更有可能是罪魁祸首。
  3. 如果效率非常关键,那么您希望使用分析器来查找程序的哪些部分实际上很慢,而不是猜测可能较慢的部分。 见#2为什么你的猜测可能是错的。

想象一下,如果你的vector包含string。 长串。 5000个长string。 不必要地复制它们,最终得到一个非常低效的写入循环。

确保你的代码遵循你的意图。 如果你不需要循环内的副本,不要做一个。

使用上面build议的参考&或者迭代器。