概述
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?
---------------------
作者:哈乐笑
来源:CSDN
原文:https://blog.csdn.net/haolexiao/article/details/56842552
版权声明:本文为博主原创文章,转载请附上博文链接!
最后
以上就是淡定百褶裙为你收集整理的C++11中range-based for loops中&&与&的区别的全部内容,希望文章能够帮你解决C++11中range-based for loops中&&与&的区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复