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);
}
}

该怎么解决呢?
...全文
445 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
  • 打赏
  • 举报
回复
插入、删除等操作之后,迭代器肯定会失效,需要重新设置
内容概要:本文提出了一种基于粒子群优化算法(PSO)的风光储能微电网日前经济调度模型,创新性地引入需求响应机制,以实现系统运行成本最小化为目标。该模型综合考虑风力发电、光伏发电、储能系统及可调节负荷的运行特性,构建了包含电力供需平衡、设备出力能力、储能容量约束在内的完整数学模型,并通过Python编程实现PSO算法求解,有效提升了新能源消纳水平并降低了购电成本与运行费用。研究不仅实现了多能源协调优化调度,还为高比例可再生能源接入背景下的微电网经济运行提供了可行的技术路径。; 适合人群:具备一定电力系统基础知识和Python编程能力的科研人员、研究生及从事新能源微电网优化调度相关工作的工程技术人员。; 使用场景及目标:①研究含高比例可再生能源的微电网经济调度问题;②掌握粒子群算法在电力系统优化中的建模与应用方法;③开展计及需求响应的多能源协同调度仿真分析,探索用户侧灵活性资源参与系统优化的潜力。; 阅读建议:建议读者结合提供的Python代码深入理解算法实现细节,重点关注目标函数构建、约束条件处理及PSO参数设置,可进一步拓展至其他智能优化算法对比分析,或引入碳排放、电压稳定性等多目标优化维度进行深化研究。

65,210

社区成员

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

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