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 _W...

STL set的使用 vector List set map 成员函数erase

STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时...

vector用erase删除元素时,为什么被删元素的析构函数会被调用更多次?

博文 http://patmusing.blog.163.com/blog/static/13583496020101831514657/ 中提到:“vector::erase的原型如下:iterat...

注意vector, list, set, map成员函数erase

From: http://blog.csdn.net/tujiaw/article/details/7770498 [cpp] view plaincopy ...

MTD(3)---nand flash的erase,read,write接口函数代码分析

本来是想按照代码流程往下讲bbt的,但是写着写着,还是要先介绍下mtd的几个基本flash读写擦函数接口。那就调整下,先讲基本接口函数,再讲到bbt的时候,就不用回头来讲基本读写函数了,这样主线清楚些...

vector中erase用法注意事项

以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错。今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.e...

注意 c++ vector中的erase()

今天帮同事解决了一个程序异常挂掉的问题,最后定位到是在vector删除元素之后,再把该对象传递给下一个app时下一个app莫名其妙的挂了。认真检查了代码发现是这里的问题。网上有个帖子,讲的挺细致的,特...

hackerrank>Dashboard>C++>STL>Vector-Erase

You are given a vector of integers.Then you are given queries.First query consists of integer ...

opencv使用vector erase 去除部分边界

一开始想要进行opencv所提取轮廓的小面积区域去除,在网上找了一圈,发现可以使用vector进行,于是就使用了下列代码:         findContours( canny_output, c...

vector的erase()影响

今天在调试一个程序,发现返回的数值有问题。 程序结构如下所述: 为了程序的高效动作,...
  • jszj
  • jszj
  • 2014年10月14日 15:35
  • 680
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vector的erase()函数分析
举报原因:
原因补充:

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