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成為野指針,不能執(zhí)行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一類算法
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等關聯(lián)容器正確。
>
【重點: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、 若是該容器是一個聯(lián)合 container,應用asso_con::erase成員函數或者remove_copy_if連絡swap等體式格式。
7、有一些斗勁特別的容器具現,比如vector等,暫不推敲。
【remove和erase對比】 一般情況下,remove是STL的函數,#include < algorithm >,而erase是容器的成員函數,#include <容器> 。 使用remove不能真正的刪除元素!
如果你真的要刪除東西的話,可以用下面兩種形式:erase-remove、erase。
但是,有特例— — list容器**
對于list,因為list有成員函數remove,因此調用list的remove成員函數可以“真的”刪除,且比應用erase-remove慣用法更高效!
總結
以上是生活随笔為你收集整理的vector/list/map/set的插入、删除、遍历 - remove\erase函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (函数/类模板)的(偏特化/全特化)
- 下一篇: C++中的hash_map和map的区别