登录社区云,与社区用户共同成长
邀请您加入社区
1、关于vector中元素的删除和迭代器失效问题vector vv;vv.push_back(1);//加入第一个元素vector::iterator itBegin = vv.begin();//获取第一个元素迭代器*itBegin=1vv.push_back(2);//因为预留不够,所以发生内存搬移,之前迭代器将全部失效vv.pus
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)); }
权威|前沿|技术|干货|国内首个API全生命周期开发者社区
更多推荐
沃云统一开发平台介绍
沃云集成平台研发平台介绍1.平台优势2.平台原理3.研发平台使用方法4.遇到的问题5.现阶段实现的功能6.后续需要补充的功能和优化内容研发平台介绍1.平台优势解决孤岛式应用,实现能力共享;现有系统框架过于复杂,跨系统业务处理成本居高不下,协同服务共享,降低运维成本;提高项目应用资源监控能力,改善资源利用率;业务微服务化,快速发布、快速部署,快速响应业务需求变化;沃云平台不仅提供了自动化的、可快速部
(20200916 Solved)docker-compose up创建容器自动退出
问题描述如题,创建容器后自动退出了。并且docker start container无效解决方案原因是缺失了控制终端的配置,需要在docker-compose.yml中增加tty:true ,有时候这样也不行,需要再增加一个command:/bin/bash,命令不一定是这个,需要是一个不会退出的命令,然后用-d后台启动容器。Referencesdocker-compose启动容器后自动退出...
基于docker的test-containers环境百宝箱
笔者语录: 我开了个公众号【Java你我他】,欢迎大家关注。 在很多时候,程序猿们更关注代码本身,而不愿意把时间花费在环境搭建上,这也是Docker变得越来越受欢迎的原因之一。test-containe是Docker生态圈中的一颗新星,其 主要针对测试领域、背靠Docker实现环境百宝箱功能。 test-containers: 你要的环境,我都有~ 假设我们现在需要一个redis-clust
扫一扫分享内容
所有评论(0)