vector用erase连续删除元素怎么会出错?

LoveBoydan 2010-10-23 04:09:20

vector<int > vt;


for (int i = 0; i < 10; i++)
{
vt.push_back(i);
}
vector<int>::iterator it;
for ( it = vt.begin(); it != vt.end(); it++)
{
vt.erase(it); // 此句代码只能删除第一个元素,删除第二个时会报错,为什么?
}
////////////////////////////////////////////

vt.erase(it); // 此句代码只能删除第一个元素,删除第二个时会报错,为什么?
那我要连续删除不用clear方法,怎么办?
...全文
346 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackson35296 2010-10-25
  • 打赏
  • 举报
回复
for ( it = vt.begin(); it != vt.end(); it++)
{
it = vt.erase(it);
}
翅膀又硬了 2010-10-25
  • 打赏
  • 举报
回复
还试了一下map和set,可以用eraser(iter++);
bragi523 2010-10-25
  • 打赏
  • 举报
回复
这种删除办法不正确

如果用vt.erase(it),it++就会越界


把it++去掉试试
lwbeyond 2010-10-25
  • 打赏
  • 举报
回复
不用循环删除!
vector<int > vt;

for (int i = 0; i < 10; i++)
{
vt.push_back(i);
}

vt.erase(vt.begin(), vt.end()); // 不用循环,也行
昨夜无风 2010-10-24
  • 打赏
  • 举报
回复
想删除所有的就用clear
Eleven 2010-10-24
  • 打赏
  • 举报
回复
vector::erase会使的被删除的元素和之后的所有元素的iterator都失效了, 即使保存了后面一个iterator, 也不能继续遍历了
hecai 2010-10-24
  • 打赏
  • 举报
回复
迭代器失效了。。。
a5680737 2010-10-24
  • 打赏
  • 举报
回复
学习了 谢谢~
Sou2012 2010-10-23
  • 打赏
  • 举报
回复
for (it = vt.begin(); it != vt.end(); it++)
{
vt.erase(it); // 此句代码只能删除第一个元素,删除第二个时会报错,为什么?
}


任何改变 vector 长度的操作都会使已存在的迭代器失效。例如,在调用 push_back 之后,就不能再信赖指向 vector 的迭代器的值了。


一个原则:对vector只要做了删除或是增加动作,就要示迭代器已经无效,必须重新从vector对象获取新的迭代器的值,而不能用临时变量、后缀自增等方法


正确的做法:
vector<int> v;
// 增加元素
for (int i = 0; i < 10; ++i)
v.push_back(i);

// 删除元素
vector<int>::iterator iter = v.begin();
while (iter != v.end())
{
iter = v.erase(iter);
}

forwin 2010-10-23
  • 打赏
  • 举报
回复
for ( it = vt.begin(); it != vt.end();)
{
it=vt.erase(it); // 此句代码只能删除第一个元素,删除第二个时会报错,为什么?
}
疯狂石头_ 2010-10-23
  • 打赏
  • 举报
回复
iterator erase(iterator it);//返回被删除元素后面的第一个元素的迭代器
for ( it = vt.begin(); it != vt.end(); )
{
it = vt.erase(it);
}

LoveBoydan 2010-10-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 superdiablo 的回复:]
可以试试这样:
for ( it = vt.begin(); it != vt.end(); )
{
vt.erase(it++);
}
[/Quote]

也不行,我试过
superdiablo 2010-10-23
  • 打赏
  • 举报
回复
可以试试这样:
for ( it = vt.begin(); it != vt.end(); )
{
vt.erase(it++);
}
ArcRain 2010-10-23
  • 打赏
  • 举报
回复
因为删除第一个元素时,vector内部的指针地址都发生变化了,所以iterator必须重新取。你可以试着这么写:

vector<int>::iterator it = vt.begin();
while(it != vt.end())
{
vt.erase(it);
it = vt.begin();
}

16,547

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧