erase()函数的功能是用来删除容器中的元素
容器按内存分配方式能够分为链表容器和数组容器。
所谓的链表容器指的是一种表现方式,包括list这样基于节点的容器(动态分配内存块)和set、map等关联容器(平衡树实现),而数组容器指的是在一块连续的内存上保存元素的连续内存容器,好比vector、deque、string等。数组
一、链表容器以list为例,当执行container.erase(it)时,确实第一个知足条件的元素删除了,但这时it指针已经被删除 了,它也不指向任何元素了,因此也只能到此为止了,也就是说上面的代码对于链表容器来讲只能正确删除第 一个知足条件的元素,针对这个问题咱们首先想到的就是在删除指针以前,给其作个备份
将这个临时变量直接创建在erase实现里,这样作更简洁,也显得专业些。
list<int>::iterator it; ide
for (it = lt.begin(); it != lt.end(); ) { if () { lt.erase(it++); //这里是关键 } else { ++it; } }
链表容器使用erase删除节点还有一个特色,就是会将下一个元素的地址返回,因此也能够这样实现:
list<int>::iterator it;
for (it = lt.begin(); it != lt.end(); )
{
if()
{
it = lt.erase(it);//自动返回下一个元素的地址,不用再主动前移指针
}
else
{
++it;
}
}
二、数组容器以vector为例,当执行container.erase(it)时,和上面提到的同样,第一个知足条件的元素删除了,但这 时数组容器不容许中间有“空隙”,因此会作个大动做,就是将被删元素后面全部的元素前移(参考STL源码), 而数 组容器记录的是下标,因此删除元素后,当前下标定位的元素也就瓜熟蒂落的变成了原有队列中的下一个 元素,同 样以删除偶数为例,代码以下:
vector<int>::iterator it = v.begin();
for (it = v.begin(); it != v.end(); )
{
if ()
{
v.erase(it);//删除元素后,后面元素自动往前移,不用挪动指
}
else
{
++it;
}
}函数