C++11中range-based for loops中与的区别
for(auto i : c)
一般用for(auto i : c)就是一個(gè)正常的拷貝,如果是一個(gè)類(lèi)的話(huà),會(huì)調(diào)用復(fù)制構(gòu)造函數(shù)。
vector<int> c = {1, 3, 5, 7, 9};
for (auto i : c)
??? cout << i << ' ';
如果遍歷的是基本類(lèi)型的話(huà),可以這么用,如果是類(lèi)的話(huà),開(kāi)銷(xiāo)比較大,不推薦。
for(auto &i : c)與for(const auto &i : c)
這個(gè)就是i是c的引用,開(kāi)銷(xiāo)小,不會(huì)調(diào)用復(fù)制構(gòu)造函數(shù),如果不想改變?cè)瓉?lái)的值得花,可以用for(const auto &i : c),如果想要改變的話(huà),用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)
重頭戲在這個(gè)地方啦,如果c為一個(gè)proxy iterators的話(huà),這方面的典型例子就是vector< bool>詳見(jiàn)我的上一篇文章,談vector< bool>的特殊性——為什么它不是STL容器。
有一個(gè)地方需要注意:
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;
如果對(duì)于vector< bool>用for(auto i : c),對(duì)i做改變,也會(huì)影響到c。
而對(duì)于vector< bool>用for(auto &i : c)在g++上會(huì)報(bào)錯(cuò)【但是我在VS上不會(huì)報(bào)錯(cuò),尷尬】
所以此時(shí)需要用右值引用for(auto &&i : c)
vector<bool> c{ false, true, false, true, false };
for (auto &&i : c){
??? i = !i;
}
而&&還可以用于非proxy iterators的情況,所以一般情況下,如果要修改遍歷的值,都要用
for (auto &&i : c)
如果不修改的話(huà),要用
for (const auto &i : c)
因?yàn)槌A恳每梢越壎ǖ揭粋€(gè)臨時(shí)值上面,用來(lái)延長(zhǎng)臨時(shí)值得生命周期,詳見(jiàn)我之前的一篇Blog:C++中const和引用的坑點(diǎn)總結(jié)
參考資料
Use auto&& for range-based for loops
What is the correct way of using C++11’s range-based for? ?
--------------------- ?
作者:哈樂(lè)笑 ?
來(lái)源:CSDN ?
原文:https://blog.csdn.net/haolexiao/article/details/56842552 ?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的C++11中range-based for loops中与的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c++标准模板库STL【快速查找】【最全
- 下一篇: yolo 学习系列