map,vector 等容器内容的循环删除问题(C++)
map,vector 等容器内容的循环删除问题(C++)
map,vector等容器的循环删除不能用普通的方法删除:
for(auto p=list.begin();p!=list.end();p++)
list.erase(p);
类似的方式,会出错的,不信你调试试试 :)
这里使用了一个` iterator` 的一个自增/自减 ,来巧妙的实现了, 删除当前的`iterator,` 但是又给当前的`iterator`赋值为其下一个的操作,不至于删除后,当前的 `iterator` 就失效了!
代码:
#include <iostream>
#include <vector>
#include <map>
using namespace std; int main()
{
const char* strs[] = {
"str1",
"str2",
"str3",
"str4",
"str5",
"str6",
"str7",
"str8",
"str9",
"str10"
};
cout << "Hello World\n"; map<string, string> list;
vector<string> arr;
for (int i = ; i>=; i--) {
list.emplace(std::make_pair(strs[i], strs[i]));
arr.emplace_back(strs[i]);
}
auto pos = list.end();
pos--;//取得倒数第一个的位置
while (pos!= list.end() && list.size()>)
list.erase(pos--);//关键在这里
while (arr.size() > )
arr.erase(--arr.end());//关键在这里
for (auto s : list) {
cout << s.first.data() << " " << s.second.data() << "\n";
}
for (auto s : arr) {
cout << s.data()<< "\n";
}
return ;
}
输出:
Hello World
str1 str1
str10 str10
str2 str2
str10
str9
str8
使用一个` iterator` 的一个自增/自减 ,来巧妙的实现了:
删除当前的`iterator`,又有给当前的`iterator`赋值为其下一个的位置,不至于删除后,当前的 `iterator` 就失效了!
代码参考:
//vector的删除某些项
//vector<T> list;
auto& it = list.begin();
while (it!=list.end()){
if (it->Code == `Code`)
it = list.erase(it);//返回下一个元素iterator
else
it++;
}
//map的删除某些项
// map<string,T> mapA;
.直接删除指定项
mapA.erase(str1);
.直接删除指定位置的项
mapA.erase(pos);
.删除符合条件的项
for (auto it = _chwList.begin(); it != _chwList.end();) {
if (it->second->Code==`Code`)
_chwList.erase(it++);
else
it++;
}
map,vector 等容器内容的循环删除问题(C++)的更多相关文章
- C/C++知识要点2——STL中Vector、Map、Set容器的实现原理
1.Vector是顺序容器.是一个动态数组.支持随机存取.插入.删除.查找等操作,在内存中是一块连续的空间.在原有空间不够情况下自己主动分配空间.添加为原来的两倍.vector随机存取效率高,可是在v ...
- 几种常见 容器 比较和分析 hashmap, map, vector, list ...hash table
list支持快速的插入和删除,但是查找费时; vector支持快速的查找,但是插入费时. map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的. 如果我自己写,我也会用二叉检索树,它在 ...
- vector list map set等容器某些函数的使用区别
map, set, vector erase的正确使用方法 一.erase 的用法区别 STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque); 另一类是以不 ...
- STL之Map和multimap容器
1.Map和multimap容器 1)map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. 2)map中key值是唯一的.集合中的元素按一 ...
- C++ STL 学习笔记__(8)map和multimap容器
10.2.9 Map和multimap容器 map/multimap的简介 ² map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. ² ...
- STL Map和multimap 容器
STL Map和multimap 容器 map/multimap的简介 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供 基于key的快速检索能力. ...
- 学习笔记之vector向量容器
今天复习到vector向量容器,里面包括vector向量容器的一些优点以及具体的使用方法及代码,分享给大家. Vector向量容器不但能够像数组一样对元素进行随机访问,还可以在尾部插入元素,是一种简单 ...
- STL学习系列九:Map和multimap容器
1.map/multimap的简介 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中key值是唯一的.集合中的元素按一定的顺 ...
- Cocos2d-x中Vector<T>容器以及实例介绍
Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容纳的是Ref及子类所创建的对象指针,其中的T是模板,表示能够放入到容器中的类型,在Cocos2d-x 3.x中T ...
随机推荐
- 重启nginx后丢失nginx.pid的解决方法
一,nginx的停止操作 停止操作是通过向nginx进程发送信号来实现的. 步骤1:查询nginx主进程号 复制代码 代码如下: ps -ef | grep nginx 在进程列表里 面找master ...
- vue学习笔记(四)——Vue实例以及生命周期
1.Vue实例API 1.构造器(实例化) var vm = new Vue({ //选项 |-------DOM(3) | |-------el (提供一个在页面上已存在的 DOM 元素作为 V ...
- struts2 从一个action跳转到另一个action的struts.xml文件的配置
解释: 想要用<result>跳转到另一个action,原来的配置代码是: <action name="insertDept" class="strut ...
- This is probably because there is no OLE editor registered against the type of file you were trying to open.
Reason: This is probably because there is no OLE editor registered against the type of file you were ...
- (1-2)SpringCloud:服务的消费者rest+ribbon
服务发现的任务是由Eureka客户端完成,而服务的消费任务由Ribbon完成.Ribbon是一个基于HTTP和TCP的客户端负载据衡器,它可以通过客户端中配置ribbonServerList服务端列表 ...
- PID算法
所谓PID就是比例-积分-微分的英文缩写,但并不是必须同时具备这三种算法,也可以是 PD, PI,甚至只有 P算法控制,下面分别介绍每个参数的含义:首先需要明确一个事实就是,要实现PID算法,必须在硬 ...
- 非线性规划带约束-scipy.optimize.minimize
# coding=utf-8 from scipy import optimize import numpy as np def get(args): a, b, c, d, e, f, g, h = ...
- oracle 配置 自启动 和 关闭
今天在看oracle自启动脚本,突然有点时间,总结一下!!! 第一次写博客,大家随便看看就好,有错误麻烦提醒下,不喜欢别喷,主要是锻炼自己,形成写博客的好习惯. 刚毕业,现在还没转正,在干运维和自学d ...
- Effective Java 第三版——29. 优先考虑泛型
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- junit源码解析--初始化阶段
OK,我们接着上篇整理.上篇博客中已经列出的junit的几个核心的类,这里我们开始整理junit完整的生命周期. JUnit 的完整生命周期分为 3 个阶段:初始化阶段.运行阶段和结果捕捉阶段. 这篇 ...