我在做一道贪心算法的练习题,其中一部分是为了遍历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");
}