You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

问题原因

  1. 逻辑判断完全偏离需求:if (*itr!=n && a==n) 的判断逻辑混乱,初始值a=n-1毫无意义,遍历过程中a的赋值规则也无法准确识别“紧跟在指定数字后的元素”。
  2. 迭代器操作错误:调用erase后,当前迭代器会失效,erase返回的是下一个有效迭代器,但你的代码在执行itr=g.erase(itr);后,循环还会执行++itr,导致跳过一个元素,直接破坏遍历流程。
  3. 遍历方式不适合修改操作:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:16:29