在list容器中寻找一个元素,然后删除,为何编译后会出现这种结果?
程序代码;#include"stdafx.h"//Note:YourchoiceisC++IDE//Note:YourchoiceisC++IDE//Note:Yourc...
程序代码;
#include "stdafx.h"// Note:Your choice is C++ IDE
// Note:Your choice is C++ IDE
// Note:Your choice is C++ IDE
#include<list>
#include<iostream>
#include<string>
using namespace std;
int main()
{
list<string>ilist;
string str;
cout<<"enter some strings ( CTRL+Z to end ) :"<<endl;
while(cin>>str)
ilist.push_back(str);
cin.clear();
cout<<"enter a string that you want to search "<<endl;
cin>>str;
for(list<string>::iterator iter=ilist.begin();iter!=ilist.end();++iter){
if(*iter==str)
{
iter=ilist.erase(iter);
--iter;
}
cout<<"after arase :"<<*iter<<endl;
}
return 0;
}
编译结果;
如输入; good luck to you
enter; Ctrl+Z
enter; 要删除的元素,假如输入 to
结果; goog luck luck you
如何改善,谢谢!! 展开
#include "stdafx.h"// Note:Your choice is C++ IDE
// Note:Your choice is C++ IDE
// Note:Your choice is C++ IDE
#include<list>
#include<iostream>
#include<string>
using namespace std;
int main()
{
list<string>ilist;
string str;
cout<<"enter some strings ( CTRL+Z to end ) :"<<endl;
while(cin>>str)
ilist.push_back(str);
cin.clear();
cout<<"enter a string that you want to search "<<endl;
cin>>str;
for(list<string>::iterator iter=ilist.begin();iter!=ilist.end();++iter){
if(*iter==str)
{
iter=ilist.erase(iter);
--iter;
}
cout<<"after arase :"<<*iter<<endl;
}
return 0;
}
编译结果;
如输入; good luck to you
enter; Ctrl+Z
enter; 要删除的元素,假如输入 to
结果; goog luck luck you
如何改善,谢谢!! 展开
1个回答
展开全部
你的程序没错,但你的描述很有问题~
实测:
enter some strings ( CTRL+Z to end ) :
good luck to you
^Z
enter a string that you want to search
to
after arase :good //good不是你要删的,于是直接打印good
after arase :luck //luck也不是你要删的,于是直接打印luck
after arase :luck //to是你要删的。于是删除了to,然后迭代器iter自动指向下一个位置,也就是you。但是你代码里又--iter了,于是iter指向了you前面一个值,即luck,于是仍旧输出luck。然后结束当前循环。但是for循环里还有个++iter,于是iter在下一个循环后又一次指向了you的下一个对象you
after arase :you //此时iter指向了you,但you又不是你要删的。于是就直接打印出you。
请按任意键继续. . .
综上,你的删除方式完全没问题。得出的结果也是合理的。唯一有可能有问题的是你本意是打印删完你想删的元素后剩下的所有元素。但你实际干的压根不是这件事。
下面帮你改下代码,使得符合我猜测的你的可能的本意~
#include <list> //list容器需要
#include <iostream> //cout,cin需要
#include <string>
#include <cstdlib> //system需要
#include <iterator> //ostream_iterator需要
#include <algorithm> //copy需要
using namespace std;
int main()
{
list<string>ilist;
string str;
cout<<"enter some strings ( CTRL+Z to end ) :"<<endl;
while(cin>>str)
ilist.push_back(str);
cin.clear();
cout << "输出list的内容:" << endl;
copy(ilist.begin(), ilist.end(), ostream_iterator<string>(cout, " ")); //这就是stl容器特有的输出流方式。
cout << endl;
cout<<"enter a string that you want to search "<<endl;
cin>>str;
for(list<string>::iterator iter=ilist.begin();iter!=ilist.end();++iter){
if(*iter==str)
{
iter=ilist.erase(iter);
--iter;
}
}
cout << "输出删完后的list的内容:" << endl;
copy(ilist.begin(), ilist.end(), ostream_iterator<string>(cout, " ")); //删完后将结果打印到屏幕上。
cout << endl;
system("pause");
return 0;
}
运行结果:
enter some strings ( CTRL+Z to end ) :
good luck to you
^Z
输出list的内容:
good luck to you
enter a string that you want to search
to
输出删完后的list的内容:
good luck you
请按任意键继续. . .
实测:
enter some strings ( CTRL+Z to end ) :
good luck to you
^Z
enter a string that you want to search
to
after arase :good //good不是你要删的,于是直接打印good
after arase :luck //luck也不是你要删的,于是直接打印luck
after arase :luck //to是你要删的。于是删除了to,然后迭代器iter自动指向下一个位置,也就是you。但是你代码里又--iter了,于是iter指向了you前面一个值,即luck,于是仍旧输出luck。然后结束当前循环。但是for循环里还有个++iter,于是iter在下一个循环后又一次指向了you的下一个对象you
after arase :you //此时iter指向了you,但you又不是你要删的。于是就直接打印出you。
请按任意键继续. . .
综上,你的删除方式完全没问题。得出的结果也是合理的。唯一有可能有问题的是你本意是打印删完你想删的元素后剩下的所有元素。但你实际干的压根不是这件事。
下面帮你改下代码,使得符合我猜测的你的可能的本意~
#include <list> //list容器需要
#include <iostream> //cout,cin需要
#include <string>
#include <cstdlib> //system需要
#include <iterator> //ostream_iterator需要
#include <algorithm> //copy需要
using namespace std;
int main()
{
list<string>ilist;
string str;
cout<<"enter some strings ( CTRL+Z to end ) :"<<endl;
while(cin>>str)
ilist.push_back(str);
cin.clear();
cout << "输出list的内容:" << endl;
copy(ilist.begin(), ilist.end(), ostream_iterator<string>(cout, " ")); //这就是stl容器特有的输出流方式。
cout << endl;
cout<<"enter a string that you want to search "<<endl;
cin>>str;
for(list<string>::iterator iter=ilist.begin();iter!=ilist.end();++iter){
if(*iter==str)
{
iter=ilist.erase(iter);
--iter;
}
}
cout << "输出删完后的list的内容:" << endl;
copy(ilist.begin(), ilist.end(), ostream_iterator<string>(cout, " ")); //删完后将结果打印到屏幕上。
cout << endl;
system("pause");
return 0;
}
运行结果:
enter some strings ( CTRL+Z to end ) :
good luck to you
^Z
输出list的内容:
good luck to you
enter a string that you want to search
to
输出删完后的list的内容:
good luck you
请按任意键继续. . .
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询