vector的erase()函数分析

原创 2016年08月31日 12:54:48

erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器,而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素的迭代器:
在进行单个元素删除后,传入的迭代器指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素。
删除一段元素后,传入的迭代器指向也是不变的,仍然指向原来传进去时候的位置,修改的是删除段后面的元素的位置。
如下代码测试其内存变化情况:

//测试对于vector中迭代器使用erase函数后,传入的迭代器参数的变化情况。
#include<iostream>
#include<vector>
using namespace std;

int main(void)
{
    vector<int>array;
    array.push_back(100);
    array.push_back(300);
    array.push_back(300);
    array.push_back(500);
    array.push_back(600);
    vector<int>::iterator itor;
    //删除单个元素
    for (itor = array.begin(); itor != array.end(); itor++)
    {
        if (*itor == 300)
        {
            itor = array.erase(itor);
        }
    }
    for (itor = array.begin(); itor != array.end(); itor++)
    {
        cout << *itor << " ";
    }
    cout << endl;
    //删除一段元素
    vector<int>::const_iterator iter_begin = array.begin() + 1;
    vector<int>::const_iterator iter_end = array.end() - 1;
    array.erase(iter_begin, iter_end);
    for (itor = array.begin(); itor != array.end(); itor++)
    {
        cout << *itor << " ";
    }
    //删除最后一个元素
    vector<int>::iterator iter_last = array.end() - 1;
    array.erase(iter_last);
    for (itor = array.begin(); itor != array.end(); itor++)
    {
        cout << *itor << " ";
    }
    return 0;
}

在删除单个元素300之前内存中的值:
即容器中的元素为100、300、300、500、600
删除单个元素之前内存中的值
删除300之前指向该元素的迭代器:
删除300之前指向该元素的迭代器
删除300之后内存中的值的变化:
此时容器中的元素为:100、300、500、600
这里写图片描述
删除300之后该迭代器情况:
删除300之后该迭代器情况
由上面的对比可知,删除单个元素前后,迭代器的指向都是不变的,而将该元素删除之后,所删除元素后边的元素会全部向前复制一个元素位置,指向容器尾部下一位的迭代器即array.end()也会相应前移一位,也就是结尾变成了红色的600,而array.end()指向白色的600。

删除一段元素:
删除之前的内存情况是:
容器中的元素为:100、300、500、600
这里写图片描述
假设要删除的是300和500;
那么传入的参数应该是指向300和600(500的下一位)的两个迭代器;
这里写图片描述
执行删除操作后,容器内存情况是:
删除后容器中的元素为:100、600。
这里写图片描述
执行删除操作后,作为参数的两个迭代器的情况是:
执行删除操作后,作为参数的两个迭代器的情况是
由上面图片可以看到,删除一段段元素之后,后面的元素(从iter_end开始到vector.end())会被复制到被删除元素段开始的地方(iter_begin开始),而vector.end()也根据删除的元素个数往前移动。上图为移动到500处,即最后一个元素600的下一个位置。

总结:删除操作传入迭代器,而迭代器所指向的位置在删除前后是不发生改变的,改变的只是容器中的元素值,删除相应元素后,被删元素后面的所有元素复制到被删除元素的位置上去,同时指向容器尾部的迭代器也移动到新的尾部位置。

版权声明:本文为博主原创文章,未经博主允许不得转载。

vector中erase用法注意事项

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(   iterator _Whe...
  • dgyanyong
  • dgyanyong
  • 2014年03月15日 03:41
  • 62841

STL vector的erase操作问题

STL vector的erase操作问题一老大说CSDN上有篇博文( “关于STL vector的erase操作”,地址是:http://blog.csdn.net/tingya/archive/20...
  • guafeng
  • guafeng
  • 2008年06月20日 19:15
  • 25208

vector的erase()函数分析

erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器,而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素...
  • dalong277
  • dalong277
  • 2016年08月31日 12:54
  • 1473

C++中Vector的erase()操作以及与remove的区别

vector v; v.pushback(0); v.pushback(1); v.pushback(1); v.pushback(0); 想要删除值为1的元素 错误代码  vecto...
  • zzuchengming
  • zzuchengming
  • 2016年03月15日 13:05
  • 2629

vector::erase() vector中如何删除元素?

vector::erase() vector中如何删除元素?
  • duan19920101
  • duan19920101
  • 2016年02月22日 16:38
  • 18114

注意 c++ vector中的erase()

#include #include vector> using namespace std;   int main() {     vectorint> arr; ...
  • zhuimengzh
  • zhuimengzh
  • 2011年10月03日 09:58
  • 19985

关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论

关于vector的erase删除操作的两种不同方法,在linux与visual studio的实现讨论1.前言:最近在做某一个题时,用到了vector的删除操作,利用的是erase()函数删除符合条件...
  • qq874455953
  • qq874455953
  • 2017年04月25日 10:19
  • 545

vector::clear(),容器vector的clear函数详解。

最近经常用到vector容器,发现它的clear()函数有点意思,经过验证之后进行一下总结。 clear()函数的调用方式是,vector temp(50);//定义了50个datatype大小的空...
  • Hk_john
  • Hk_john
  • 2017年05月18日 12:56
  • 816

关于 vector 中 erase 函数的使用注意事项

做项目时,总是
  • Jff316948714
  • Jff316948714
  • 2014年07月04日 18:43
  • 3362

vector中erase用法注意事项

以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错。今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.e...
  • daofengdeba
  • daofengdeba
  • 2012年08月14日 15:31
  • 62983
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vector的erase()函数分析
举报原因:
原因补充:

(最多只允许输入30个字)