use*_*561 55 c++ for-loop auto c++11
在C++ 11中,我可以迭代一些容器,如下所示:
for(auto i : vec){
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但我知道这是不必要的 - 不必要的,因为我只需要打印 -的值vec
- 制作(编辑:每个元素)的副本vec
,所以我可以这样做:
for(auto &i : vec){
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是我想确保它们的值vec
永远不会被修改并遵守const-correctness,所以我可以这样做:
for(const auto &i : vec){
std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:如果我只需要查看某个容器的值,那么最后的循环(const auto &i
)是否总是首选,因为没有额外副本(编辑:每个元素)的效率提高vec
?
我正在开发一个我正在开发的程序,我正在考虑在整个过程中进行这种改变,因为效率是至关重要的(我在第一时间使用C++的原因).
GMa*_*ckG 70
是.如果您只读取参数的参数,也会出现同样的原因const&
.
T // I'm copying this
T& // I'm modifying this
const T& // I'm reading this
Run Code Online (Sandbox Code Playgroud)
这些是你的"默认值".但是,如果T
是基本类型(内置),通常只需要恢复const T
(无引用)进行读取,因为副本比别名便宜.
我正在开发一个我正在开发的程序,我正考虑在整个过程中进行此更改,因为效率至关重要
免责声明:一般来说,auto
和之间的区别auto&
是微妙的,部分是风格问题,但有时也是正确性问题。我不会在这里介绍一般情况!
在基于范围的 for 循环中,
for (auto element : container) {}
Run Code Online (Sandbox Code Playgroud)
和
for (auto& element_ref : container) {}
Run Code Online (Sandbox Code Playgroud)
是 中element
元素的副本container
,而element_ref
是对容器中元素的引用。
要查看操作上的差异,请考虑以下示例:
#include <iostream>
int main(void) {
int a[5] = { 23,443,16,49,66 };
for (auto i : a) i = 5;
for (const auto& i : a) std::cout << i << std::endl;
for (auto& i : a) i = 5;
for (const auto& i : a) std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它会打印
23
443
16
49
66
5
5
5
5
5
Run Code Online (Sandbox Code Playgroud)
因为第一个循环处理数组元素的副本,而第二个循环实际上修改数组中的元素。
如果您不想修改元素,那么通常 aconst auto&
更合适,因为它避免了复制元素(这可能很昂贵)。