C++11中range-based for loops中&&与&的区别
2017-02-25 14:39
435 查看
不得不说外国的技术博客还是要比中国的好太多,之前一直迷茫与range-based for loops中究竟&&与&该怎么用的问题,看了一下国外的技术讨论,真是豁然开朗,而国内的技术博客,几乎就没有见这方面的东西。
如果遍历的是基本类型的话,可以这么用,如果是类的话,开销比较大,不推荐。
有一个地方需要注意:
如果对于vector< bool>用for(auto i : c),对i做改变,也会影响到c。
而对于vector< bool>用for(auto &i : c)在g++上会报错【但是我在VS上不会报错,尴尬】
所以此时需要用右值引用for(auto &&i : c)
而&&还可以用于非proxy iterators的情况,所以一般情况下,如果要修改遍历的值,都要用
如果不修改的话,要用
因为常量引用可以绑定到一个临时值上面,用来延长临时值得生命周期,详见我之前的一篇Blog:C++中const和引用的坑点总结
What is the correct way of using C++11’s range-based for?
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 loopsWhat is the correct way of using C++11’s range-based for?
相关文章推荐
- C++11 新特性之Range-based for loops
- C++11 range-based for loops
- 一些C++11语言新特性 - Range-Based for Loops
- C++11新特性之四:range-based for loops
- C++11 性能Range-based for loops
- C++11新特性之基本范围的For循环(range-based-for)
- C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)
- C++11 | range-based for loop
- 自定义类型使用range-based for loops
- C++11新特性:range based for loop-范围for循环基本使用方法
- c++11 : range-based for loop
- C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)
- c++11 : range-based for loop
- Range-Based for Loops
- C++11中的有趣的新特性(constexpr ) (Range-based for loop)
- java反射(1) 之class.forName(""), 类名.class, 对象.getClass()区别
- MySQL错误"Out of range value adjusted for column ..."的解决方法
- Longest Consecutive Sequence & Longest Common Prefix & Search for a Range
- Data truncation: Out of range value for column 'ID' at row 2
- swift for-in循环中"..."与".."的区别