C++ STL List代码异常:特定场景删除元素结果不符求助
问题描述
我正在完成C++实验作业,需求是从键盘输入数字,删除STL list中紧跟该数字之后的元素。但当列表为{1,2,2,3,4,2,5}、指定数字为2时,输出结果为{1,2,2,2},而非预期的{1,2,2,4,2}。附上相关代码,尝试修改逻辑但问题反而更多,请求排查原因。
#include <iostream> #include <iterator> #include <list> using namespace std; list<int> STL_MyList(std::list<int> g, int n); int main() { int s, d; list<int>::iterator it; cout<<"Enter how many elements you want in the list?"<<endl; cin>>s; cout<<"Start now: "<<endl; cin>>d; list<int> list1{d}; for (int i = 0; i < s-1; ++i) { cin>>d; list1.push_back(d); } for (auto i : list1) { cout << i << ' '; } cout<<endl<<"After what number do you want to delete element?"<<endl; cin>>s; list1.operator=(STL_MyList(list1, s)); cout<<"Result:"<<endl; for (auto i : list1) { cout << i << ' '; } cout<<endl<<"Do you want to do it again? (Yes - 1 / No - 0)"<<endl; cin>>s; if (s){ main(); } else{ cout<<"Finish."; } return 0; } //Delete element after n in STL list list<int> STL_MyList(list<int> g, int n){ auto itr = g.begin(); int a=n-1; for (itr = g.begin(); itr != g.end(); ++itr){ if (*itr!=n && a==n) { itr=g.erase(itr); } a=*itr; } return g; }
问题原因
- 逻辑判断完全偏离需求:
if (*itr!=n && a==n)的判断逻辑混乱,初始值a=n-1毫无意义,遍历过程中a的赋值规则也无法准确识别“紧跟在指定数字后的元素”。 - 迭代器操作错误:调用
erase后,当前迭代器会失效,erase返回的是下一个有效迭代器,但你的代码在执行itr=g.erase(itr);后,循环还会执行++itr,导致跳过一个元素,直接破坏遍历流程。 - 遍历方式不适合修改操作:使用
for循环遍历并修改列表时,很容易出现迭代器越界或跳过元素的问题,while循环更适合这种需要动态调整迭代器的场景。
修正方案
正确的核心函数实现
list<int> STL_MyList(list<int> g, int n) { auto itr = g.begin(); while (itr != g.end()) { // 找到指定数字,且该数字不是列表最后一个元素 if (*itr == n && next(itr) != g.end()) { // 删除紧跟的下一个元素,erase返回下一个有效迭代器 itr = g.erase(next(itr)); } else { // 未触发删除时,迭代器正常前进 ++itr; } } return g; }
额外优化:替换递归调用
原main函数中递归调用main()存在栈溢出风险,改用循环更安全:
int main() { bool runAgain; do { int s, d; cout << "Enter how many elements you want in the list?" << endl; cin >> s; cout << "Start now: " << endl; cin >> d; list<int> list1{d}; for (int i = 0; i < s-1; ++i) { cin >> d; list1.push_back(d); } for (auto i : list1) { cout << i << ' '; } cout << endl << "After what number do you want to delete element?" << endl; cin >> s; list1 = STL_MyList(list1, s); cout << "Result:" << endl; for (auto i : list1) { cout << i << ' '; } cout << endl << "Do you want to do it again? (Yes - 1 / No - 0)" << endl; cin >> runAgain; } while (runAgain); cout << "Finish."; return 0; }
内容的提问来源于stack exchange,提问作者Orkhan Mirzoev
相关产品推荐
相关产品推荐

