日韩性视频-久久久蜜桃-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函数的全部內容,希望文章能夠幫你解決所遇到的問題。

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