STL中erase() 使用区别

本文介绍了STL中链表容器(如list)与数组容器(如vector)使用erase()函数删除元素的不同行为及其实现细节。对于链表容器,erase()会返回下一个元素的地址;而对于数组容器,则会自动将后面的元素前移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

erase()函数的功能是用来删除容器中的元素
容器按内存分配方式可以分为链表容器和数组容器。
所谓的链表容器指的是一种表现方式,包括list这样基于节点的容器(动态分配内存块)和set、map等关联容器(平衡树实现),而数组容器指的是在一块连续的内存上保存元素的连续内存容器,比如vector、deque、string等。

1、链表容器以list为例,当执行container.erase(it)时,确实第一个满足条件的元素删除了,但这时it指针已经被删除 了,它也不指向任何元素了,所以也只能到此为止了,也就是说上面的代码对于链表容器来说只能正确删除第 一个满足条件的元素,针对这个问题我们首先想到的就是在删除指针之前,给其做个备份
将这个临时变量直接建立在erase实现里,这样做更简洁,也显得专业些。
list<int>::iterator it;

 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;
}
}
2、数组容器以vector为例,当执行container.erase(it)时,和上面提到的一样,第一个满足条件的元素删除了,但这 时数组容器不允许中间有“空隙”,所以会做个大动作,就是将被删元素后面所有的元素前移(参考STL源码), 而数 组容器记录的是下标,所以删除元素后,当前下标定位的元素也就顺理成章的变成了原有队列中的下一个 元素,同 样以删除偶数为例,代码如下:
vector<int>::iterator it = v.begin();
for (it = v.begin(); it != v.end(); )
{
if ()
{
v.erase(it);//删除元素后,后面元素自动往前移,不用挪动指
}
else
{
++it;
}
}

转载于:https://blog.51cto.com/wenxuehui/2057624

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值