c++新手问题,求高手解答
我们实验课要写一个程序,计算输入单词的个数及每一个词出现的次数
一开始我是这样写的
int main(){
string word;
vector<string> inword;
vector<string>::iterator iter1,iter2;
while(cin>>word)
inword.push_back(word);
typedef vector<string>::size_type vec_sz;
vec_sz size=inword.size();
cout << "单词个数: " << size << endl;
for(iter1=inword.begin();iter1!=inword.end();++iter1){
int count=1;
for(iter2=inword.begin()+1;iter2!=inword.end();){
if(*iter1==*iter2){
++count;
iter2=inword.erase(iter2);
}else
++iter2;
}
cout << *iter1 << "出现次数:" << count << endl;
}
return 0;
}
这样编译没有错误,运行时弹框提示vector iterators incompatible,后来我将第二层循环的初始化改成了iter2=iter1+1,结果就正确了,请问这个到底是怎么回事~~ C++
[解决办法]
int main(){
string word;
vector<string> inword;
vector<string>::iterator iter1,iter2;
while(cin>>word)
inword.push_back(word);
typedef vector<string>::size_type vec_sz;
vec_sz size=inword.size();
cout << "单词个数: " << size << endl;
for(iter1=inword.begin();iter1!=inword.end();++iter1){
int count=1;
for(iter2=inword.begin()+1;iter2!=inword.end();){
if(*iter1==*iter2){
++count;
iter2=inword.erase(iter2);
}else
++iter2;
}
cout << *iter1 << "出现次数:" << count << endl;
}
return 0;
}
以后把代码这么贴出来
[解决办法]
erase 以后,不能保证,vector 不会重新分配内存。
当分配新内存时,所有iter1指向的是旧的内存地址。
所以iter1 会失效,iter2是erase函数返回的,已经更新了,所以不会失效除非等于end();
实际上这里根本不能这么做。
应该交换位置
然后resize();
[解决办法]
注意iterator可能会失效。