目录

1.erase函数介绍

2.删除vector中的指定元素

3.删除vector中的指定元素----时间复杂度高版本

4.删除vector中的指定元素----时间复杂度优化版本----推荐版本

5.删除vector中的指定元素----利用失效的迭代器


1.erase函数介绍

ector::erase():从指定容器删除指定位置的元素或某段范围内的元素

vector::erase()方法有两种重载形式,分别如下:

iterator erase(   iterator _Where); 删除指定位置的元素,返回值是一个迭代器,指向删除元素的下一个元素;

iterator erase(   iterator _First,   iterator _Last); 删除从_First开始到_Lsat位置的元素,返回值也是一个迭代器,指向最后一个删除元素的下一个位置。

2.删除vector中的指定元素

vector<int> count = {0,1,2,2,2,2,2,3,4};
for(auto iter=count.begin();iter!=count.end();iter++)
{
    if(2 == *iter)
    {
        count.erase(iter);
    }
}
for(auto const & v : count)
{
    cout<<v<<","
}
cout<<endl;

打印结果如下:0,1,2,2,3,4,

可以发现并没有删除干净,这是因为erase之后,迭代器失效,此时的迭代器指向的是删除元素的下一个元素,然后再加上for循环的iter++,这样就会越过一个元素,导致没有被完全删除干净.

3.删除vector中的指定元素----时间复杂度高版本

既然在第一次删除2的时候,迭代器已经失效了,那么我们可以在失效后,重置迭代器为begin,再次进行遍历。代码如下:

vector<int> count = {0,1,2,2,2,2,2,3,4};
for(auto iter=count.begin();iter!=count.end();)
{
    if(2 == *iter)
    {
        count.erase(iter);
        iter = count.begin();
    }
    else
    {
        iter++;
    }
}
for(auto const & v : count)
{
    cout<<v<<",";
}
cout<<endl;

这样写是能够把所有的2都删掉,但是存在一个问题,就是每删除一个元素之后都从头开始遍历,效率太低了.

4.删除vector中的指定元素----时间复杂度优化版本----推荐版本

由于erase函数的返回值是指向当前被删除元素的下一个元素的迭代器,我们把这个返回值赋给iter,

vector<int> count = {0,1,2,2,2,2,2,3,4};
for(auto iter=count.begin();iter!=count.end();)
{
    if(2 == *iter)
    {
        iter = count.erase(iter);
    }
    else
    {
        iter++;
    }
}
for(auto const & v : count)
{
    cout<<v<<",";
}
cout<<endl;

5.删除vector中的指定元素----利用失效的迭代器

另外,我在别的博客里面搜erase的时候,有好几个地方都说erase之后,原来的iter成了野指针,于是我用试了一下,发现erase之后原来的iter并不会成为野指针,而是指向被删除元素的下一个元素位置,所以我们不把erase函数的返回值赋给iter,继续使用已经失效的迭代器也是可以完成任务的,代码如下.

vector<int> count = {0,1,2,2,2,2,2,3,4};
for(auto iter=count.begin();iter!=count.end();)
{
    if(2 == *iter)
    {
        count.erase(iter);
    }
    else
    {
        iter++;
    }
}
for(auto const & v : count)
{
    cout<<v<<",";
}
cout<<endl;

参考文献:

如何正确删除vector中的元素    https://zhengkang.blog.csdn.net/article/details/92801632

vector.erase()用法介绍及注意事项;    https://blog.csdn.net/Xiaohei00000/article/details/49382521/

vector中erase用法注意事项    https://blog.csdn.net/daofengdeba/article/details/7865229

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐