意外的分段错误

Unexpected segmentation error

本文关键字:错误 分段 意外      更新时间:2023-10-16

我写了一个非常简单的程序,但是当我尝试编写队列的大小(使用STL创建)时,它崩溃了。我不知道为什么,请帮忙。

#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int n, i, x, cut = 0;
    queue<int> que;
    vector<int> vec;
    cin >> n;
    for (i = 1; i <= n; i++) {
        cin >> x;
        vec.push_back(x);
    }
    sort(vec.begin(), vec.end());
    for (i = 0; i < n; i++)
        que.push(vec[i]);
    while (!que.empty()) {
        cout << que.size() << 'n';
        cut += que.front();
        while (que.front() <= cut)
            que.pop();
    }
    return 0;
}

会收到错误,因为在队列为空时调用front。只需检查内部循环中的队列是否为空:

#include <queue>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int n, i, x, cut = 0;
    queue<int> que;
    vector<int> vec;
    cin >> n;
    for (i = 1; i <= n; i++) {
        cin >> x;
        vec.push_back(x);
    }
    sort(vec.begin(), vec.end());
    for (i = 0; i < n; i++)
        que.push(vec[i]);
    while (!que.empty()) {
        cout << que.size() << 'n';
        cut += que.front();
        while (!que.empty() && que.front() <= cut )
            que.pop();
    }
    return 0;
}

你的代码实际上崩溃了:

while (que.front() <= cut)

因为您有一个可能对整个队列为真的循环。下一行弹出一个值。在某些时候,您的队列是空的,que.front()会崩溃。