Vscode 显示"exception has occurred"



下面的代码显示"分段故障";在这条线路上if (shortlist[i].deadline < (*s).deadline)怎么了?

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class task
{
public:
int profit;
int deadline;
int number;
};
bool by_profit(const task &left, const task &right)
{
return left.profit > right.profit;
}
void schedule(int num, vector<task> shortlist, vector<task> &result)
{
for (int i = 1; i < num; i++)
{
bool largest = 1;
vector<task>::iterator s = result.begin();
for (; s != result.end(); s++)
{
if (shortlist[i].deadline < (*s).deadline)
{
largest = 0;
break;

}
}
if (largest == 0)
{
result.insert(s, shortlist[i]);
}
else
{
result.push_back(shortlist[i]);
s = --result.end();
}
for (int e = 0; e < result.size(); e++)
{
if (result[e].deadline > e + 1)
{
result.erase(s);
}
}
}
for (task a : result)
{
cout << a.number;
}
}
int main()
{
int num;
cin >> num;
vector<task> shortlist;
shortlist.reserve(num);
for (int i = 0; i < num; i++)
{
cin >> shortlist[i].profit >> shortlist[i].deadline;
shortlist[i].number = i + 1;
}
vector<task> result;
result.reserve(num);
result.push_back(shortlist[0]);
sort(shortlist.begin(), shortlist.end(), by_profit);
schedule(num, shortlist, result); // 7 40 3 35 1 30 1 25 3 20 1 15 3 10 2
system("pause");
return 0;
}

reserve与resize不同。

所以你们试图填写入围名单的循环是无效的。

Reserve只分配内存,但不更改大小。所以你还是得背着你。

另一方面,resize同时执行这两个操作(代价是可能初始化每个元素(。

所以,要么在循环中使用推回,要么用调整大小来代替第一个保留。

相关内容

最新更新