关于C++中vector的迭代器的问题

我写了一段程序,但是总会出错,请哪位大虾指点一下:#include<iostream>#include<string>#include<vector>usingnames... 我写了一段程序,但是总会出错,请哪位大虾指点一下:
#include<iostream>
#include<string>
#include<vector>
using namespace std;

void main()
{
vector<string> *s1 = new vector<string>[2];
s1[0].push_back("abc");
s1[0].push_back("def");
s1[0].push_back("ghi");
s1[1].push_back("abc");
s1[1].push_back("jkl");

vector<string> s2;
s2.push_back("def");
s2.push_back("ghi");

for(int i = 0; i < 2; i ++)
{
for(int j = 0; j < 2; j ++)
{
for(vector<string>::iterator it = s1[j].begin(); it != s1[j].end(); ++ it)
{
if(*it == s2[i])
s1[j].erase(it);
}
}
}

for(i = 0; i < 2; i ++)
{
for(int j = 0; j < s1[i].size(); j ++)
cout << s1[i][j] << " ";
cout << endl;
}
}
应该是第一个for循环中的问题,循环体中的代码如果单独运行没有错误,但是一放在循环体中运行就出错,不知如何修改?
展开
 我来答
百度网友d8d5c33c5
2011-03-19 · 超过73用户采纳过TA的回答
知道小有建树答主
回答量:234
采纳率:0%
帮助的人:183万
展开全部
#include<iostream>
#include<string>
#include<vector>
using namespace std;

void main()
{
vector<string> *s1 = new vector<string>[2];
s1[0].push_back("abc");
s1[0].push_back("def");
s1[0].push_back("ghi");
s1[1].push_back("abc");
s1[1].push_back("jkl");

vector<string> s2;
s2.push_back("def");
s2.push_back("ghi");

for(int i = 0; i < 2; i ++)
{
for(int j = 0; j < 2; j ++)
{
for(vector<string>::iterator it = s1[j].begin(); it != s1[j].end(); ++ it)
{
if(*it == s2[i])
{
it = s1[j].erase(it); //erase完后,it变成野指针,该函数返回删除的
//元素后面那个元素的it
if(it == s1[j].end())
{
break;
}
}
}
}
}

for(int i = 0; i < 2; i ++)
{
for(int j = 0; j < s1[i].size(); j ++)
cout << s1[i][j] << " ";
cout << endl;
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wds315
2011-03-19 · TA获得超过186个赞
知道小有建树答主
回答量:142
采纳率:50%
帮助的人:49.4万
展开全部
因为你删除( s1[j].erase(it);)了以后,it就已经无效了。所以循环的it++,必然导致错误。
建议:
(vector<string>::iterator it2;
for(vector<string>::iterator it = s1[j].begin(); it != s1[j].end(); )
{
if (it != s1[j].end()) it2 = it + 1; //这样记下来下一个。
if(*it == s2[i])
s1[j].erase(it);
it = it2; //其实就是it++
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
她是我的小太阳
高粉答主

2015-11-15 · 醉心答题,欢迎关注
知道顶级答主
回答量:5.1万
采纳率:83%
帮助的人:8930万
展开全部
vector<int> v(3); //定义这个时,v中已经有三个元素,全部是0
v[0]=0;
v[1]=1;//现在v中元素是0 1 0
v.push_back(3); //现在v中元素是0 1 0 3
first last是迭代器
vector<int>::iterator first=v.begin();
vector<int>::iterator last=v.end();
这里定义出来的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-03-20
展开全部
楼上的,就不要出来误导人了;
请问下删除it后it2 = it + 1没失效吗?
简单点
if(*it == s2[i]){
it=s1[j].erase(it);
contiune;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ljbangshou
2011-03-20
知道答主
回答量:1
采纳率:0%
帮助的人:0
展开全部
打快了,是continue,不是contiune;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式