vector的erase问题

minioreo 2007-05-07 04:17:52
我想遍历vector的时候动态的删掉一些节点 不过在删除以后 迭代器会出问题 我做了一个实验 是这样的
void main()
{
vector<int> v;
vector<int>::iterator it;
int i[4]={1,3,2,4};
int a;
for(a=0;a<4;a++)
{
v.push_back(a[i]);
}
for(it=v.begin();it!=v.end();it++)
{
if(*it>2)
v.erase(it);
}
}

该怎么解决呢?
...全文
393 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
minioreo 2007-05-08
  • 打赏
  • 举报
回复
多谢大家 明白了
to Ordie(ordie)
这个方法很简单 用上了 thank u
  • 打赏
  • 举报
回复
to playmud((猪头流氓)
没事就上来玩啊
Ordie 2007-05-07
  • 打赏
  • 举报
回复
erase方法返回指向被删除元素下一个元素的迭代器,因此你的循环可以这样写:
for(it=v.begin();it!=v.end();)
{
if(*it>2)
{
it = v.erase(it);
}
else
{
++it;
}
}

另外,++it应该比it++效率高一点。
playmud 2007-05-07
  • 打赏
  • 举报
回复
坏节假日还来回答问题啊,真敬业
shaoshuai321 2007-05-07
  • 打赏
  • 举报
回复
erase会返回删除后的下一个节点 你可以从这里继续循环
  • 打赏
  • 举报
回复
因为 remove_if 是把不符合的移到最后
v.erase(new_end,v.end());才是真正的删除。
believefym 2007-05-07
  • 打赏
  • 举报
回复
new_end = remove_if (v.begin( ), v.end( ), greater2 );
v.erase(new_end,v.end());
--------
为什么不连续的也能正常删除呢?
believefym 2007-05-07
  • 打赏
  • 举报
回复
bool greater2(int i)
{
return i>2;
}
believefym 2007-05-07
  • 打赏
  • 举报
回复
vector<int> v;
vector<int>::iterator it, new_end;
int i[4]={1,3,2,4};
for(int a=0;a<10;a++)
{
v.push_back(rand()%10);
}

random_shuffle ( v.begin( ), v.end( ) );

new_end = remove_if (v.begin( ), v.end( ), greater2 );
v.erase(new_end,v.end());

for (it = v.begin(); it!=v.end(); ++it)
{
cout<<*it<<endl;
}
  • 打赏
  • 举报
回复
for(it=v.begin();it!=v.end();it++)
{
if(*it>2)
v.erase(it);
}
改成这样吧
没测试
v.erase(remove_if(v.begin(),v.end(),bind2nd(greater<int>(),2)),v.end());
lightnut 2007-05-07
  • 打赏
  • 举报
回复
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

bool Condition(int value)
{
if (value>2) return true;
else return false;
}

int main()
{

// initialize v
vector<int> v;
int a[4]={1,3,2,4};
for(int i=0;i<4;i++) v.push_back(a[i]);

// erase all items satisfied the Condition in the vector v;
vector<int>::iterator it = remove_if(v.begin(), v.end(), Condition);
while (it!=v.end()) {
v.erase(it, v.end());
it = remove_if(v.begin(), v.end(), Condition);
}

// print the result v
for (int i=0; i<v.size(); ++i) cout<<v[i];

system("pause");


return 0;
}
minioreo 2007-05-07
  • 打赏
  • 举报
回复
可是这样以后迭代器又回到了begin处 遍历过的元素又要再一次遍历 能不能从删除以后的那里继续读?或者有别的什么解决方案么?自己写个链表太麻烦了。。。
believefym 2007-05-07
  • 打赏
  • 举报
回复
it = v.begin()-1;//不过这样效率肯定不高,或者你把符合条件的存到另一个vector里
believefym 2007-05-07
  • 打赏
  • 举报
回复
for(it=v.begin();it!=v.end();it++)
{
if(*it>2)
v.erase(it);
it = v.begin();//不过这样效率肯定不高,或者你把符合条件的存到另一个vector里
}
believefym 2007-05-07
  • 打赏
  • 举报
回复
插入、删除等操作之后,迭代器肯定会失效,需要重新设置

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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