vector中erase删除元素用法及注意事项
目录
4.删除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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)