C++11中range-based for loops中与的区别
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++标准模板库STL【快速查找】【最全
- 下一篇: yolo 学习系列