vector、map容器删除操作总结
来源:互联网 发布:战舰世界mac版 编辑:程序博客网 时间:2024/06/13 07:34
http://blog.csdn.net/shellching/article/details/4777496
1、关于vector中元素的删除和迭代器失效问题
- vector<int> vv;
- vv.push_back(1); //加入第一个元素
- vector<int>::iterator itBegin = vv.begin(); //获取第一个元素迭代器*itBegin=1
- vv.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 = 9
- vector<int>::iterator itrmv = remove(vv.begin(), vv.end(), 3); //结果:1,2,1,1,4,5,6,5,6
- n = vv.size(); //n = 9
- //删除vector中等于某值的所有元素
- //remove算法只是对容器中有效元素向前移动覆盖无效元素,返回第一个无效元素指针
- //1、它不会有删除动作 2、尾部无效元素没有意义 3、之后容器size不变
- vv.erase(itrmv, vv.end()); //结果:1,2,1,1,4,5,6
- n = vv.size(); //n = 7
- bool BeDelete(int n)
- {
- return n == 1 || n == 2;
- }
- //借助remove_if算法删除vecotr中符合某些条件的所有元素
- vv.erase(remove_if(vv.begin(), vv.end(), BeDelete), vv.end()); //结果:4,5,6
- n = 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 = 10
- vn.push_back(1);
- vn.push_back(2);
- nn = vn.capacity(); //nn = 10
- vector<int>(vn).swap(vn); //通过建立一个新对象释放多余空间
- nn = vn.capacity(); //nn = 2
- nn = vn.size(); //nn = 2
- vector<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+erase
- map<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));
- }
- vector、map容器删除操作总结
- vector、map容器删除操作总结
- 顺序容器vector 与 关联容器map的总结
- STL容器删除操作总结
- STL容器删除操作总结
- C++容器vector和map的正确删除方法
- C++容器vector和map的正确删除方法
- vector,map各种容器类型的使用方法总结
- Vector容器删除元素
- vector::erase():容器删除
- vector 容器删除元素
- Vector容器删除元素
- vector map删除元素
- c++ vector 删除, map
- STL中map/vector的删除元素操作
- C++容器 vector list map
- vector set map 容器比较
- Vector容器操作
- logback 学习笔记
- c语言内部(汇编代码分析)函数调用过程探究
- 某个面试算法题
- 框架struts2和struts1线程是否安全问题探讨
- iOS手势UIGestureRecognizer
- vector、map容器删除操作总结
- 螺旋矩阵
- Java将long对象生成Byte[]对象
- MySql 获取表的字段名
- Oracle数据库编程:PL/SQL程序控制结构
- Linux内存管理:逻辑地址到线性地址和物理地址的转换
- Fixchart图表组件——仪表盘,纳尼?
- Oracle数据库编程:在PL/SQL中更改数据和管理事物
- Oracle数据导入导出