qq_39347661 2019-05-21 11:43 采纳率: 33.3%
浏览 775
已结题

c++ 迭代器 erase之后出了问题,已解决,但不知道我错误的原因

我在做一道贪心算法的练习题,其中一部分是为了遍历vector,然后把里面符合要求的部分删除,但是却报了奇怪的错误。我稍微改了一下,错误解决了,但我搞不清楚错误的原因。希望有大神能给我一些建议。

不要网上的答案,我只要针对我这个具体问题的错误原因。

出错的部分:

    vector<struct dianshi>::iterator it2 = ds.begin();
            while (it2 != ds.end()) {
                //外面的大循环进行到第三轮,在这里报错了
                if (it2!=min_it&& (*it2).start_time < min) {
                    it2 = ds.erase(it2);//删除元素,返回值指向已删除元素的下一个位置
                }
                else {
                    it2++;
                }
            }
            ds.erase(min_it);
        }

测试用例:

12

1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9


下面是两个源代码

错误的代码:

#include<iostream>
#include<vector>
#include<iterator>
using namespace std;
struct dianshi {
    int start_time, end_time;
};
int main() {
    int num;


    while (cin >> num&&num!=0) {
        int cnt = 0;
        vector<struct dianshi> ds;
        while (num--) {
            struct dianshi a;
            cin >> a.start_time >> a.end_time;
            ds.push_back(a);
        }

        while (!ds.empty()) {
            cnt++;
            int min = ds.front().end_time;
            vector<struct dianshi>::iterator min_it = ds.begin();
            //找到那个结束时间最早的
            for (vector<struct dianshi>::iterator it = ds.begin(); it != ds.end(); it++) {
                if ((*it).end_time < min) {
                    min = (*it).end_time;
                    min_it = it;
                }
            }
            //删除开始时间比这个结束时间早的所有。
            vector<struct dianshi>::iterator it2 = ds.begin();
            while (it2 != ds.end()) {
                //外面的大循环进行到第三轮,在这里报错了
                if (it2!=min_it&& (*it2).start_time < min) {
                    it2 = ds.erase(it2);//删除元素,返回值指向已删除元素的下一个位置
                }
                else {
                    it2++;
                }
            }
            ds.erase(min_it);
        }

        cout << cnt;

    }

    system("pause");
}

改正后的代码

#include<iostream>
#include<vector>
#include<iterator>
using namespace std;
struct dianshi {
    int start_time, end_time;
};
int main() {
    int num;


    while (cin >> num&&num!=0) {
        int cnt = 0;
        vector<struct dianshi> ds;
        while (num--) {
            struct dianshi a;
            cin >> a.start_time >> a.end_time;
            ds.push_back(a);
        }

        while (!ds.empty()) {
            cnt++;
            int min = ds.front().end_time;
            vector<struct dianshi>::iterator min_it = ds.begin();
            //找到那个结束时间最早的
            for (vector<struct dianshi>::iterator it = ds.begin(); it != ds.end(); it++) {
                if ((*it).end_time < min) {
                    min = (*it).end_time;
                    min_it = it;
                }
            }
            //删除开始时间比这个结束时间早的所有。
            ds.erase(min_it);
            vector<struct dianshi>::iterator it2 = ds.begin();
            while ( it2 != ds.end()) {
                if ((*it2).start_time < min) {
                    it2 = ds.erase(it2);//删除元素,返回值指向已删除元素的下一个位置
                }
                else {
                    it2++;
                }
            }
            //ds.erase(min_it);
        }

        cout << cnt;

    }

    system("pause");
}


  • 写回答

3条回答 默认 最新

  • threenewbee 2019-05-21 12:48
    关注

    删除元素会修改迭代器的状态,导致错误,解决方法是从后往前删除。或者每次删除后,重新迭代。

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器