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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vector/list/map/set的插入、删除、遍历 - remove\erase函数

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vector/list/map/set的插入、删除、遍历 - remove\erase函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、vector中刪除滿足某些條件的元素和迭代器失效問題

#include <iostream> #include <vector> using namespace std; int main() {std::vector<int> mVector;mVector.push_back(1); //插入元素push_backmVector.push_back(2);mVector.push_back(0);mVector.push_back(3);mVector.push_back(4);mVector.push_back(0);mVector.push_back(0);mVector.push_back(6);mVector.push_back(0);mVector.push_back(0);std::vector<int>::iterator iter = mVector.begin();for (; iter != mVector.end(); ) //刪除操作{if (0 != *iter){++iter;}else{iter = mVector.erase(iter); //方式一(正確) //mVector.erase(iter++); //方式二(錯誤)//mVector.erase(it); it++; //方式三(錯誤)}for (iter = mVector.begin();; iter != mVector.end(); ++iter)//vector遍歷操作{std::cout << " " << *iter << " ";}return 0; } 【錯誤分析】 /*方式三:錯誤vv.erase(it); //對vector進行增加刪除等操作后之前it可能無效it++; //刪除后it此時已經無效,it成為野指針,不能執行it++操作 /*方式二:錯誤該種情況,vector、deque不能用,但是list、map、set可以!

2、list中刪除滿足某些條件的元素

#include <iostream> #include <list> using namespace std; int main() {std::list<int> mList;mList.push_back(1); //插入操作push_backmList.push_back(2);mList.push_back(0);mList.push_back(3);mList.push_back(4);mList.push_back(0);mList.push_back(0);mList.push_back(6);mList.push_back(0);mList.push_back(0);std::list<int>::iterator iter = mList.begin();for (; iter != mList.end(); ) //刪除操作{if (0 != *iter){++iter;}else{iter = mList.erase(iter); //方式一(正確)//mList.erase(iter++); //方式二(正確)//mList.erase(iter); iter++; //方式三(錯誤)}}iter = mList.begin();for (; iter != mList.end(); ++iter) //遍歷操作{std::cout << " " << *iter << " ";}return 0; }

3、map中刪除滿足某些條件的元素
注意:對map和set等自動排序的容器不應使用remove一類算法

#include <iostream> #include <string> #include <map> using namespace std; int main(int argc, char* argv[]) { map<int, string> mapData; //插入元素方式(四種)mapData.insert(pair<int,string>(0,"aaa"));mapData[1] = "bbb"; mapData.insert(make_pair<int,string>(2,"ccc"));mapData.insert(map<int,string>::value_type(3,"ddd"));for (map<int, string>::iterator it=mapData.begin(); it!=mapData.end(); /*it++*/) //刪除操作{ if ((*it).first == 2) { it = mapData.erase(it); //方式一(正確)//mapData.erase(it++); //方式二(正確)//mVector.erase(it); it++; //方式三(錯誤)} else { it++; } } for (map<int, string>::iterator it=mapData.begin(); it!=mapData.end(); it++) //map遍歷輸出{cout<<(*it).first<<" "<<(*it).second<<endl; //取值操作方式 (*it).first和(*it).second}return 0; }

3、set中刪除滿足某些條件的元素

#include<iostream> #include<set> using namespace std; int main() { set<int> s; s.insert(5); //第一次插入5,可以插入 s.insert(1); s.insert(0); s.insert(3); s.insert(5); //第二次插入5,重復元素,不會插入 s.erase(-1); set<int>::iterator it = s.begin(); for(;it != s.end();) //刪除操作{if(*it < 2){//it = s.erase(it); //方式一(正確)//s.erase(it++); //方式二(正確)//s.erase(it); it++; //方式三(錯誤)}elseit++;}for(it = s.begin(); it != s.end(); it++) //遍歷操作cout << *it << " "; return 0; }

綜上所述,
對于刪除操作:
方式一都正確;
方式三都錯誤;
方式二vector/deque等順序容器錯誤、list/map/set等關聯容器正確。

>

【重點:remove和erase講解】
1、 erase一般作為一個container的成員函數,是真正刪除的元素,是物理上的刪除。
2、作為算法項目組的remove類函數,是邏輯上的刪除,將被刪除的元素移動到容器末尾,然后返回新的末尾,此時容器的size不變更。
3、項目組容器若有成員函數remove,那么代表的是真正物理意義上的刪除元素。
4、若是該容器是vector、string或者deque,應用erase-remove idiom或者erase-remove_if idiom。
5、若是該容器是list,應用list::remove或者list:remove_if成員函數。
6、 若是該容器是一個聯合 container,應用asso_con::erase成員函數或者remove_copy_if連絡swap等體式格式。
7、有一些斗勁特別的容器具現,比如vector等,暫不推敲。

【remove和erase對比】 一般情況下,remove是STL的函數,#include < algorithm >,而erase是容器的成員函數,#include <容器> 。 使用remove不能真正的刪除元素!
如果你真的要刪除東西的話,可以用下面兩種形式:erase-remove、erase。

vector<int> v; v.erase(remove(v.begin(), v.end(), 99), v.end());//刪除容器v中的所有的值為99的元素//[總結] //使用的固定形式: //v.erase(remove(v.begin(), v.end(), VALUE), v.end()); //這句的意思是,取得VALUE的位置(位于結尾),然后刪除VALUE到原vector結尾的所有元素 // remove all elements from Numbers that match 10 vector<int>::iterator ret = remove(Numbers.begin(), Numbers.end(), 10) ;【解釋】原vector { 10 20 10 15 12 7 9 },刪除10,會將10后面的元素移動到前面 (注意以下逐個元素對齊,模擬元素在內存中的位置,這樣就容易看出變化規律) 原vector 10 20 10 15 12 7 9 遇到第一個10,數組變成 20 10 15 12 7 9 遇到第二個10移動到7 9之后又遇到第三個10于是剩下內存中未移動的7 9 20 15 12 7 9 7 9 遇到第三個10 20 15 12 7 9 7 9

但是,有特例— — list容器**
對于list,因為list有成員函數remove,因此調用list的remove成員函數可以“真的”刪除,且比應用erase-remove慣用法更高效!

list<int> li; // 建立一個list// 放一些值進去 li.remove(99); // 除去所有等于99的元素// 真的刪除值為99的元素// 所以list的大小可能改變了

總結

以上是生活随笔為你收集整理的vector/list/map/set的插入、删除、遍历 - remove\erase函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本大尺度做爰呻吟舌吻 | 亚洲毛片视频 | 国产一二区在线观看 | 不卡的日韩av | 欧美不卡一区二区三区 | 国产精品一区不卡 | 神马久久久久久 | 欧美一区免费看 | 日韩欧美一区二区一幕 | www.欧美精品 | 欧美资源站 | 亚洲国产成人精品女人久久久 | 舐め犯し波多野结衣在线观看 | 欧美成人精品激情在线观看 | a天堂v| 色花av| 天天爱综合网 | 伊人久久大香线 | 中文在线不卡视频 | 野花国产精品入口 | 亚洲a一区 | 亚洲熟妇国产熟妇肥婆 | 精品亚洲永久免费精品 | 狠狠操操 | 欧美成人免费在线视频 | 波多野结衣视频网站 | 7799精品视频 | 欧美成人午夜视频 | 国产妇女馒头高清泬20p多 | 丝袜老师扒开让我了一夜漫画 | 俄罗斯乱妇 | 亚洲深夜视频 | 亚洲无人禁区 | 青青操青青| 国产91丝袜在线播放九色 | av中文资源| 影音先锋中文字幕在线 | 欧美激情亚洲 | 在线亚洲人成电影网站色www | 亚洲少妇中文字幕 | 五月天丁香婷 | 亚洲啪啪免费视频 | 日韩免费视频一区二区 | 中文字幕超碰在线 | 黄色片亚洲 | 国产视频日韩 | 一级视频免费观看 | 在线观看网站av | 91麻豆网| 亚洲乱码精品久久久久.. | 国产乱码精品一区二区三 | h在线播放 | 一级片久久久 | www狠狠操 | 6680新视觉电影免费观看 | 国产不卡视频 | 久久黄色网 | 日韩精品一区二区三区av | 午夜国产| 狠狠搞视频 | 色av免费 | 成人ay| 午夜网站在线观看 | 国产日皮视频 | 成人在线免费播放 | 99re久久 | 人妻熟女一区二区aⅴ水野 91在线观看视频 | 在线免费中文字幕 | 黄网站免费在线观看 | 91日日夜夜 | 国产黄色一区 | 久久精品五月天 | 婷婷看片 | 精品一区二区三区蜜桃 | 朝桐光在线观看 | 亚洲看片网 | 91国产网站 | 国产香蕉精品视频 | 日韩高清三区 | av色片| 精品视频在线一区 | 美女被娇喘流出白 | 亚洲精品在线看 | 日韩制服在线 | 51嘿嘿嘿国产精品伦理 | 国产精品一二区 | 日本东京热一区二区三区 | 中文字幕亚洲图片 | 天天干,天天操,天天射 | 在线观看麻豆 | 能看的av网站 | 黄色网页观看 | 国产乱妇无码大片在线观看 | 久久久久久久香蕉 | 先锋资源中文字幕 | 秋霞福利影院 | 男女啪啪无遮挡 | 嫩草一区 | 久热在线 |