日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++11 for区间遍历:vector几种遍历方式

發(fā)布時(shí)間:2023/12/2 c/c++ 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++11 for区间遍历:vector几种遍历方式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

近來(lái),基本上所有現(xiàn)代編程語(yǔ)言都有一種對(duì)一個(gè)區(qū)間寫(xiě)for循環(huán)的便捷方式。最終,C++也有了相同的概念;你可以給循環(huán)提供一個(gè)容器,它幫你迭代。

example:

#include <iostream> #include <vector> #include <map> using namespace std;int main() {vector<int> num{3, 7, 1, 7, 9};// 修改你正在迭代的容器的值,或者你想避免拷貝大的對(duì)象for(auto &it : num) {cout << ++it << endl;}// it 用于捕獲vector里面的值for(auto it :num) {cout << it << endl;}map<int, int> num_map; num_map[2] = 4;num_map[4] = 5;num_map[6] = 1;for(auto it : num_map) { cout << it.first << endl<< ",second: " << it.second << endl;} }

代碼分析:
1

#include <iostream> #include <vector> #include <map> using namespace std;int main() {vector<int> num{3, 7, 1, 7, 9};// 修改你正在迭代的容器的值,或者你想避免拷貝大的對(duì)象for(auto it : num) {it++;}// it 用于捕獲vector里面的值for(auto it :num) {cout << it << endl;} }

結(jié)果

Build commands will be stored in build/compile_commands.json 'build' finished successfully (2.229s) 3 7 1 7 9

*原因: 迭代器沒(méi)有取引用的操作,并沒(méi)有修改原vector的值

#include <iostream> #include <vector> #include <map> using namespace std;int main() {vector<int> num{3, 7, 1, 7, 9};// 修改你正在迭代的容器的值,或者你想避免拷貝大的對(duì)象for(auto &it : num) {it++;}// it 用于捕獲vector里面的值for(auto it :num) {cout << it << endl;} } Waf: Leaving directory `/home/antl417/AI_LB-files/Fattree_DiaoTest_Summary/build' Build commands will be stored in build/compile_commands.json 'build' finished successfully (2.246s) 4 8 2 8 10

2

#include <iostream> #include <vector> #include <map> using namespace std;int main() {map<int, int> num_map; num_map[2] = 4;num_map[4] = 5;num_map[6] = 1;for (auto m = num_map.begin(); m != num_map.end(); ++m){m->second = 0.0;}for(auto it : num_map) { cout << it.first <<",second: " << it.second << endl;} }

結(jié)果

2,second: 0 4,second: 0 6,second: 0

區(qū)間遍歷的意義:

Strings,arrays,和所有的STL容器可以被新的區(qū)間迭代方式迭代。但是如果你想讓你自己的數(shù)據(jù)結(jié)構(gòu)使用這個(gè)新語(yǔ)法怎么辦?

為了使這個(gè)數(shù)據(jù)結(jié)構(gòu)可迭代,它必須類(lèi)似于STL迭代器。

這個(gè)數(shù)據(jù)結(jié)構(gòu)必須要有begin和end方法,成員方法和獨(dú)立函數(shù)都行,這兩個(gè)方法分別返回開(kāi)始和結(jié)束的迭代器
迭代器支持操作符、!=操作符、++方法(前綴形式,成員函數(shù)和獨(dú)立函數(shù)都行)
就這些!實(shí)現(xiàn)這五個(gè)函數(shù),你就可以有一個(gè)支持區(qū)間迭代的數(shù)據(jù)結(jié)構(gòu)。因?yàn)閎egin、end可以是非成員函數(shù),你甚至可以適配現(xiàn)有數(shù)據(jù)結(jié)構(gòu)而不用實(shí)現(xiàn)STL風(fēng)格的迭代器。所有你要做的是創(chuàng)建你自己的支持、前綴++和!=的迭代器,并且定義好自己的begin、end。

另外,vector的幾種遍歷方式:

#include <vector> #include <iostream> #include <algorithm> // for_eachusing namespace std;struct Point {double x;double y;Point(){x = 0;y = 0;} };int main() {vector<Point> m_testPoint;m_testPoint.clear();m_testPoint.shrink_to_fit();for (int i = 0; i<10; ++i){Point temp;temp.x = i*i;temp.y = i*i;m_testPoint.push_back(temp);}//第一種遍歷方式,下標(biāo)cout << "第一種遍歷方式,下標(biāo)訪問(wèn)" << endl;for (int i = 0; i<m_testPoint.size(); ++i){cout << m_testPoint[i].x << " " << m_testPoint[i].y << endl;}//第二種遍歷方式,迭代器cout << "第二種遍歷方式,迭代器訪問(wèn)" << endl;for (vector<Point>::iterator iter = m_testPoint.begin(); iter != m_testPoint.end(); iter++){cout << (*iter).x << " " << (*iter).y << endl;}//第三種遍歷方式,auto關(guān)鍵字cout << "C++11,第三種遍歷方式,auto關(guān)鍵字" << endl;for (auto iter = m_testPoint.begin(); iter != m_testPoint.end(); iter++){cout << (*iter).x << " " << (*iter).y << endl;}//第四種遍歷方式,auto關(guān)鍵字的另一種方式cout << "C++11,第四種遍歷方式,auto關(guān)鍵字" << endl;for (auto i : m_testPoint){cout << i.x << " " << i.y << endl;}// 第五種遍歷方式,for_eachcout << "C++11,第五種遍歷方式,for_each" << endl;for_each(m_testPoint.cbegin(), m_testPoint.cend(), [](const auto &val) -> void { cout << val.x << " " << val.y << endl; });return 0;

總結(jié)

以上是生活随笔為你收集整理的C++11 for区间遍历:vector几种遍历方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。