C++容器之 vector map set 删除元素
前面一章节主要是针对容器的增加,可以明显看到关联容器和顺序容器的特点,下面主要介绍两类容器的删除和查找的区别目录1、vector的元素删除2、map的元素删除3、set的元素删除小结代码1、vector的元素删除vector的删除主要有三种方法:erase、pop_back和 remove(algortihm)。iterator erase(i...
前面一章节主要是针对容器的增加,可以明显看到关联容器和顺序容器的特点,下面主要介绍两类容器的删除和查找的区别
目录
1、vector的元素删除
vector的删除主要有三种方法:erase、pop_back和 remove(algortihm)
。
iterator erase(iterator first,iterator second)
删除区间[first,last)之间的元素iterator erase(iterator position)
删除当前位置的元素,但注意删除后、position 会自动++, 返回的iterator指向新的容器中(最后一个删除元素)的下一个位置。
void clear()
清空所有元素void pop_back()
删除最后一个元素iterator remove(iterator first,iterator second,value)
返回最后一个元素的iterator,容器后面的依然保留了。
经常使用方法:
iv.erase(remove(iv.begin(), ib.end(), remove_value), iv.end());
算法描述:查找的得到第一个元素的位置,然后从此位置开始遍历容器,将后面的元素依次前移,跳过和value相同值的元素.
也就是说,所有和value相同值的元素都会被覆盖,而其他的元素都会依次前移。
最后,remove返回”指向最后一个 ‘有用’ 元素的iterator”,
但是在remove算法过程中,并没有修改原容器的size,以及end()。
2、map的元素删除
map的删除
map::erase()
下面两种方法和vector的相同
iterator erase(iterator first,iterator second)
删除区间[first,last)之间的元素iterator erase(iterator position)
删除当前位置的元素,但注意删除后、position不会自动++,被删除元素的迭代器,在删除之后失效!这里是和vector的区别!
3、set的元素删除
- (1) 移除set容器内元素值为value的所有元素,返回移除元素的个数
size_type erase(value)
- (2) 移除pos位置上的元素,无返回值
void erase(iterator pos)
删除后pos不会自动++!这里是和vector的区别
不会自动++,被删除元素的迭代器,在删除之后失效!这里是和vector的区别!
- (3) 移除迭代区间[first,last)内的所有元素,无返回值
void erase(iterator first, iterator last)
(4) 移除set容器内所有的元素
void clear()
小结
从上面来看,其实两类容器在删除的功能来说是很相似的,都主要删除指定的iterator和区间内的iterator。唯一不一样的是,因为两者在内存中的形式不一样,如果调用remove()
方法以后,vector对应的iterator所指向的删除后的下一个位置。而后者这是指着失效的iterator.
代码
#include <iostream>
#include <algorithm>
using namespace std;
#include <map>
typedef pair<int,string> stuType;
void print(map<int,string> stu)
{
auto ib = stu.begin();
while(ib != stu.end())
{
cout << ib->first << " " << ib->second << endl;
ib++;
}
}
int main(int argc, char *argv[])
{
map<int,string> mapstu;
//1.方法1:pair
pair<map<int,string>::iterator,bool> insert_pair = mapstu.insert(pair<int,string>(1,"LiLei"));
//若插入成功insert_pair.second为true
if(insert_pair.second)
cout <<" insert success!" << endl;
mapstu.insert(stuType(2,"HanMeiMei"));
//2.方法2:value_type
mapstu.insert(map<int,string>::value_type(3,"xiaoming"));
//3.方法3:数组形式
mapstu[6] = "ZhaoYun";
print(mapstu);
//删除
cout << "---before erase---\n";
map<int,string>::iterator ib= mapstu.begin();
for(;ib!= mapstu.end();ib++)
cout << ib->first << " " << ib->second << endl;
cout << "--------------\n";
ib = mapstu.begin();
mapstu.erase(ib);
print(mapstu);
return 0;
}
>>> insert success!
1 LiLei
2 HanMeiMei
3 xiaoming
6 ZhaoYun
---before erase-
1 LiLei
2 HanMeiMei
3 xiaoming
6 ZhaoYun
--------------
2 HanMeiMei
3 xiaoming
6 ZhaoYun
有个奇怪的现象
:
如果,在输出的时候,以数组的形式访问的话,那么对于不存在key的结点,那么会自动增加该结点到map中,value的值为空字符。
更多推荐
所有评论(0)