STL-erase与remove讲解

本文详细介绍了C++ STL中vector的erase方法的两种重载形式,以及在删除元素时常见的错误用法。错误用法1是删除元素后未更新迭代器,导致野指针;错误用法2是保存了erase的返回值但未正确处理。正确做法是在for循环中使用erase返回值来更新迭代器。同时提到了remove算法与erase结合删除元素的技巧。
摘要由CSDN通过智能技术生成

erase: 

从指定容器删除指定的元素

两个重载:

iterator erase (iterator position);
删除指定位置position的元素,并返回删除元素的下一个元素的迭代器

iterator erase (iterator first, iterator last);
删除从first到last(不包过last)之间的元素 [first,last),并返回last位置迭代器

错误用法1

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

void print(int n)
{
    cout << n << " ";
}
int main(int argc, char** argv)
{
    int arr[6] = { 1,2,3,3,4,3 };
    vector<int> vc(arr, arr + 6);
    vector<int>::iterator iter;
    for (vector<int>::iterator iter = vc.begin(); iter != vc.end(); iter++)
    {
        if (3 == *iter)
        {
            vc.erase(iter);
        }
    }
    for_each(vc.begin(), vc.end(), print);
    system("pause");
    return 0;
}
 

编译OK,运行报错。

vc.erase(iter)执行之后,iter就变成了野指针,对一个野指针进行iter++操作肯定会出错。

错误用法2

保存vc.erase(iter)返回值

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

void print(int n)
{
    cout << n << " ";
}
int main(int argc, char** argv)
{
    int arr[6] = { 1,2,3,3,4,3 };
    vector<int> vc(arr, arr + 6);
    vector<int>::iterator iter;
    for (vector<int>::iterator iter = vc.begin(); iter != vc.end(); iter++)
    {
        if (3 == *iter)
        {
            iter = vc.erase(iter);
        }
    }
    for_each(vc.begin(), vc.end(), print);
    system("pause");
    return 0;
}
 

编译OK

运行报错。

①无法连续删除2个连续的3

②当3位于vector最后位置时,也会报错。错误原因,在vc.end()上执行++操作

正常情况下,vc.end()执行如下位置

正确做法

for语句里面删除元素时,返回值指向已删除元素的下一个位置,不是删除元素是直接进行++操作。

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

void print(int n)
{
    cout << n << " ";
}
int main(int argc, char** argv)
{
    int arr[6] = { 1,2,3,3,4,3 };
    vector<int> vc(arr, arr + 6);
    vector<int>::iterator iter;
    for (vector<int>::iterator iter = vc.begin(); iter != vc.end(); )
    {
        if (3 == *iter)
        {
            iter = vc.erase(iter);
        }
        else
        {
            ++iter;
        }
    }
    for_each(vc.begin(), vc.end(), print);
    system("pause");
    return 0;
}

remove:

iterator remove(iterator first, iterator last,const value_type &val);

remove函数会把原本置于后面的没有移除的元素向前移动,覆盖被移除的元素。

STL中remove()只是将待删除元素之后的元素移动到vector的前端,而不是删除。函数的返回值是一个前向迭代器,指向变动后的序列的新逻辑终点(也就是最后一个未被移除元素的下一位置)这里再强调一下:所有的算法操作的容器区间 都是半开区间,包括起点begin,不包括终点end。


v.erase(remove(v.begin(), v.end(), value), v.end());

经常与erase函数结合而达到删除的效果。注意这里所讲的remove函数是algorithm头文件的! 

如果是list容器自己的remove函数可以达到删除的效果!!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值