关于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循环中的问题,循环体中的代码如果单独运行没有错误,但是一放在循环体中运行就出错,不知如何修改? 展开
#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循环中的问题,循环体中的代码如果单独运行没有错误,但是一放在循环体中运行就出错,不知如何修改? 展开
5个回答
展开全部
#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;
}
}
#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;
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为你删除( 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++
}
建议:
(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++
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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();
这里定义出来的
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;
}
请问下删除it后it2 = it + 1没失效吗?
简单点
if(*it == s2[i]){
it=s1[j].erase(it);
contiune;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
打快了,是continue,不是contiune;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询