C++ primer中关于容器的问题
int main()
{
string sa[4]={"quasi", "simba", "frollo", "scar"};
deque<string> slist(sa,sa+4);
string searchValue("simba");
for(deque<string>::iterator si=slist.begin();si!=slist.end();++si)
cout<<*si<<endl;
deque<string>::iterator siter=find(slist.begin(),slist.end(),searchValue);
if(siter!=slist.end())
{
slist.erase(siter);
cout<<*siter<<endl;
}
return 0;
}
代码如上,为什么我分别用vector,list,deque三种容器,输出都不一样呢?按书上说的应该都是输出frollo才对呀,我在VC2005中,输出分别是frollo, ,quasi(注:第二个为空白), 哪位高人指点一下啊,谢谢了。
另在VC6中的结果与在VC2005中又不一样!!
问题点数:10、回复次数:9Top
1 楼tghost333(换了工具,总是新手)回复于 2006-12-03 22:16:40 得分 0
dingTop
2 楼zlbruce()回复于 2006-12-03 22:31:02 得分 0
erase 之后,迭代器就已经失效了Top
3 楼Albertjj(Albert)回复于 2006-12-03 22:37:18 得分 0
slist.erase(siter);
cout<<*siter<<endl;
这两句换一下Top
4 楼owlling(owlman)回复于 2006-12-03 22:43:03 得分 0
看看关于迭代器失效的问题吧,很多操作会导致迭代器失效的,。一旦迭代器失效了,他的行为就无法预测了,不要说不同容器,就是相同容器相同的编译器编译出来的程序两次运行的结果都有可能不相同的。
==================================
欢迎访问我的个人主页:http://www.lingjie.net/
==================================Top
5 楼dushman(肥珍)回复于 2006-12-04 01:30:15 得分 0
在C++ primer 后面几页有说明,当插入,和删除时候迭代器会实效,所以要特别注意失效的问题Top
6 楼dushman(肥珍)回复于 2006-12-04 01:34:16 得分 0
这里也有讨论迭代器失效的问题
http://bbs.chinaunix.net/archiver/?tid-779150.htmlTop
7 楼mochen5460(mochen)回复于 2006-12-04 19:03:48 得分 0
C++ primer的书上是这么说的:c.erase(p) 删除迭代器p所指向的元素,返回一个迭代器,它指向被删除元素后面的元素。如果p指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。如果p本身就是指向超出末端的下一位置的迭代器,则该函数示定义。
按照这种说法,应该都是输出frollo呀Top
8 楼A_B_C_ABC(黄瓜@YouCanDoIt)回复于 2006-12-04 20:10:18 得分 10
C++ primer的书上是这么说的:c.erase(p) 删除迭代器p所指向的元素,返回一个迭代器,它指向被删除元素后面的元素。如果p指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。如果p本身就是指向超出末端的下一位置的迭代器,则该函数示定义。
按照这种说法,应该都是输出frollo呀
=========================================
if(siter!=slist.end())
{
siter=slist.erase(siter);//你要这里保存返回的迭代器,才会是输出frollo呀,否则siter就失效了啊
cout<<*siter<<endl;
}Top
9 楼mochen5460(mochen)回复于 2006-12-05 10:33:58 得分 0
谢谢ABC,一针见血。我是初学者,以后多指教啊Top




