vector、map容器删除操作总结时间:2022-04-01 22:14:02 1、关于vector中元素的删除和迭代器失效问题 vector<int> vv;vv.push_back(1);//加入第一个元素vector<int>::iterator itBegin = vv.begin();//获取第一个元素迭代器*itBegin=1vv.push_back(2);//因为预留不够,所以发生内存搬移,之前迭代器将全部失效vv.push_back(1);//即是说itBegin现在已经是个无效迭代器vv.push_back(1);//所以使用vector迭代器一定要小心失效!vv.push_back(3);//移动、增加、插入、删除以及reserve、resize都可能使迭代器无效!vv.push_back(4);vv.push_back(3);vv.push_back(5);vv.push_back(6);int n = vv.size();//n = 9vector<int>::iterator itrmv = remove(vv.begin(), vv.end(), 3);//结果:1,2,1,1,4,5,6,5,6n = vv.size();//n = 9//删除vector中等于某值的所有元素//remove算法只是对容器中有效元素向前移动覆盖无效元素,返回第一个无效元素指针//1、它不会有删除动作 2、尾部无效元素没有意义 3、之后容器size不变vv.erase(itrmv, vv.end());//结果:1,2,1,1,4,5,6n = vv.size();//n = 7bool BeDelete(int n){return n == 1 || n == 2;}//借助remove_if算法删除vecotr中符合某些条件的所有元素vv.erase(remove_if(vv.begin(), vv.end(), BeDelete), vv.end());//结果:4,5,6n = vv.size();//n = 3//若用循环实现删除,需要注意erase后迭代器失效问题for(vector<int>::iterator it=vv.begin(); it!=vv.end(); ){if(*it == 4){/*错误的做法vv.erase(it);//对vector进行增加删除等操作后之前it可能无效it++;//it此时已经无效*//*错误的做法vv.erase(it++);//erase后元素发生了移动所以it多向后跳过一个元素*/it = vv.erase(it);//正确的做法,erase返回下一个有效it}else{it++;}}n = vv.size();//n=2,结果:5,6 2、释放vector容器多余的内存 vector<int> vn;vn.reserve(10);//预留10个元素空间int nn = vn.capacity();//nn = 10vn.push_back(1);vn.push_back(2);nn = vn.capacity();//nn = 10vector<int>(vn).swap(vn);//通过建立一个新对象释放多余空间nn = vn.capacity();//nn = 2nn = vn.size();//nn = 2vector<int>().swap(vn);//会完全清空容器,释放所有空间 3、map中删除满足某些条件的元素 map<int, int> mm;mm.insert(make_pair(1,1));mm.insert(make_pair(2,2));mm.insert(make_pair(3,1));mm.insert(make_pair(4,3));mm.insert(make_pair(5,3));mm.insert(make_pair(6,6));//注意:对map和set等自动排序的容器不应使用remove一类算法//应使用for+erase或者while+find_if+erase//第一种方法for+erasemap<int, int>::iterator mit;for(mit = mm.begin(); mit != mm.end();){if(mit->second == 1){mm.erase(mit++);//这里需要注意}else{mit++;}}//第二种方法,while+find_if+erase//仅以元素做条件检索bool mBeDelete(const pair<int, int>& val){return val.second == 1;}mit = find_if(mm.begin(), mm.end(), mBeDelete);while(mit != mm.end()){mit = find_if(mm.erase(mit), mm.end(), mBeDelete);}//除元素外还需要传入另外一个条件参数//这里的参数无法使用常量引用bool mBeDelete2(pair<int, int> val, int n){return val.second == n;}mit = find_if(mm.begin(), mm.end(), bind2nd(ptr_fun(mBeDelete2),3));while(mit != mm.end()){mit = find_if(mm.erase(mit), mm.end(), bind2nd(ptr_fun(mBeDelete2),3));}