for(auto i : c)
一般用for(auto i : c)就是一个正常的拷贝,如果是一个类的话,会调用复制构造函数。
vector<int> c = {1, 3, 5, 7, 9};
for (auto i : c) cout << i << ' ';
如果遍历的是基本类型的话,可以这么用,如果是类的话,开销比较大,不推荐。 for(auto &i : c)与for(const auto &i : c)
这个就是i是c的引用,开销小,不会调用复制构造函数,如果不想改变原来的值得花,可以用for(const auto &i : c),如果想要改变的话,用for(auto &i : c)
vector<int> c = {1, 3, 5, 7, 9}; for (auto &i : c) i *= 10;
for (auto i : c) cout << i << ' '; //输出10,30,50,70,90
for(auto &&i : c)
重头戏在这个地方啦,如果c为一个proxy iterators的话,这方面的典型例子就是vector< bool>详见我的上一篇文章,谈vector< bool>的特殊性——为什么它不是STL容器。 有一个地方需要注意:
vector<bool> c{ false, true, false, true, false }; for (auto i : c) cout << i << " "; //输出0 1 0 1 0 cout << endl; for (auto i : c){ i = !i; } for (auto i : c) cout << i << " "; //输出1 0 1 0 1 cout << endl;
如果对于vector< bool>用for(auto i : c),对i做改变,也会影响到c。 而对于vector< bool>用for(auto &i : c)在g++上会报错【但是我在VS上不会报错,尴尬】 所以此时需要用右值引用for(auto &&i : c)
vector<bool> c{ false, true, false, true, false }; for (auto &&i : c){ i = !i; }
而&&还可以用于非proxy iterators的情况,所以一般情况下,如果要修改遍历的值,都要用
for (auto &&i : c)
如果不修改的话,要用
for (const auto &i : c)
因为常量引用可以绑定到一个临时值上面,用来延长临时值得生命周期,详见我之前的一篇Blog:C++中const和引用的坑点总结 参考资料
Use auto&& for range-based for loops
What is the correct way of using C++11’s range-based for? --------------------- 作者:哈乐笑 来源: 原文:https://blog.csdn.net/haolexiao/article/details/56842552 版权声明:本文为博主原创文章,转载请附上博文链接!