vector中的插入和排序,出了错误,不知道什么原因

哈利_蜘蛛侠 2013-10-23 01:49:17
#include部分我就不写了。
这个程序要做的事情很简单:
首先输入一些单词组成的文章text,
然后将这文章中的所有单词按照字典顺序排序,
然后输出排序的结果,
然后电脑问用户是不是需要添加一些单词
然后用户输入任意多的单词,每输入一个,程序都会用按照字典顺序将其插入到text中,并输出排序的结果。

编译的时候没问题,但是运行的时候,到了while语句部分时,就会弹出窗口报错,说vector iterators incompatible,无法理解,自认为不会有这样的错误。哪位大神来解释一下子呢?

注:displayText是把一个vector<string>类型的变量中的所有元素输出的函数



int main()
{
vector<string> text;
string text_word;
cout<<"\nInput a text:\n";
while(cin>>text_word)
{
text.push_back(text_word);
}
cin.clear();
cout<<"\n--------So the text you have input is:\n";
displayText(text);
cout<<"\n\n--------After resort, it becomes:\n";
resortText(text);
displayText(text);

cout<<"\n\nNow please insert some new words:\n";
string new_word;
while(cin>>new_word)
{
vector<string>::iterator location=insertLocation(new_word, text);
text.insert(location,1,new_word);
cout<<"\n--------After you have added the new words, the original text has changed into(sorted in the dictionary order):\n";
displayText(text);
}
cin.clear();

}

void resortText(vector<string> &text)
{
vector<string>::iterator beg=text.begin(), end=text.end(),index1=beg,index2=index1;
for(;index1 != end; ++index1)
{
for(index2 = index1+1; index2 != end; ++index2)
{
if(*index1 > *index2)
{
string temp = *index1;
*index1 = *index2;
*index2=temp;
}
}
}
}

vector<string>::iterator insertLocation(string word, vector<string> text)
{
vector<string>::iterator location=text.begin();
while((location != text.end()) && word>*location)
{
++location;
}
return location;
}
...全文
275 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
henrystark90 2013-10-27
  • 打赏
  • 举报
回复
引用 8 楼 u011873969 的回复:
[quote=引用 4 楼 HANRUI90 的回复:] 赞同楼上的,类在离开作用域的时候会自动析构,操作就无效了。用引用传参,传递的是类型本身,操作正确。
用引用的话,不是可能会更改原vector的状态吗?怎么做比较保险呢?前面加一个const?[/quote] 加const,指明对象不可变比较好。
buyong 2013-10-24
  • 打赏
  • 举报
回复
或者先把所有单词都加入vector,然后统一排序。效率好很多
buyong 2013-10-24
  • 打赏
  • 举报
回复
vector<string>::iterator insertLocation(string word, vector<string>& text)
rocktyt 2013-10-23
  • 打赏
  • 举报
回复
如果没有更改状态,请用const引用
henrystark90 2013-10-23
  • 打赏
  • 举报
回复
赞同楼上的,类在离开作用域的时候会自动析构,操作就无效了。用引用传参,传递的是类型本身,操作正确。
sniffer12345 2013-10-23
  • 打赏
  • 举报
回复
乱用STL的典型例子啊。。用set不行吗?
哈利_蜘蛛侠 2013-10-23
  • 打赏
  • 举报
回复
引用 4 楼 HANRUI90 的回复:
赞同楼上的,类在离开作用域的时候会自动析构,操作就无效了。用引用传参,传递的是类型本身,操作正确。
用引用的话,不是可能会更改原vector的状态吗?怎么做比较保险呢?前面加一个const?
哈利_蜘蛛侠 2013-10-23
  • 打赏
  • 举报
回复
引用 6 楼 buyong 的回复:
这样还是危险,vector insert之后迭代器有可能失效,你的测试数据可能没发生这种情况。
什么意思?没明白。while循环的每一步都重新定义了一个iterator呀
Adol1111 2013-10-23
  • 打赏
  • 举报
回复
可能说的有点问题,最主要的还是insert插入的时候需要自身的迭代器位置,编译器提示的是迭代器不匹配,就是你指定的迭代器不是自身的
Adol1111 2013-10-23
  • 打赏
  • 举报
回复
应该是因为不用引用,传递的是vector的拷贝,造成了返回的迭代器和原来的vector位置不匹配。 详细的说就是值传递会造成一个临时拷贝,而这个拷贝vector在退出函数时被析构了,跟这个vector有关的迭代器都会失效,但你仍然返回了这个迭代器。 此外,从另一个角度来说也是有问题的,你的insert插入的不是本身的vector迭代器的位置,而是另一个vector的位置,也就是说你想把这个值插入到另一个vector中,而且还是一个无效的vector位置。
哈利_蜘蛛侠 2013-10-23
  • 打赏
  • 举报
回复
经过反复的研究,发现把 vector<string>::iterator insertLocation(string word, vector<string> text) 改成 vector<string>::iterator insertLocation(string word, vector<string> &text) 就行了。可是为什么要改?无法理解。这个函数并没有更改text的状态啊!
buyong 2013-10-23
  • 打赏
  • 举报
回复
这样还是危险,vector insert之后迭代器有可能失效,你的测试数据可能没发生这种情况。

64,654

社区成员

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

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