【问题标题】:Unexpected segmentation error意外的分段错误
【发布时间】:2015-04-15 19:23:21
【问题描述】:

我编写了一个非常简单的程序,但是当我尝试写入队列的大小(使用 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;
}

【问题讨论】:

  • que 为空时,que.front() &lt;= cut 会是什么?看来您假设它是错误的。回顾这个假设。要么这样,要么您打算将该条件放入 if 而不是 while
  • 也是一个样式问题——如果你知道你想遍历向量的所有元素,那么使用单独的变量来保存条目的数量。相反,请使用 vector::size() 函数。我说的是您在第二个for 循环中使用的n 变量——此时不需要它。我知道现在的程序很简单,但是使用向量告诉你它的大小是你应该养成的习惯。
  • @PaulMcKenzie - 我以后会考虑的!谢谢!

标签: c++ segmentation-fault queue iostream cout


【解决方案1】:

您收到错误消息,因为您在队列为空时调用了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;
}

【讨论】:

  • 我确实忘记验证内部循环了。我刚刚开始使用 STL,而且我不习惯验证所有可能会崩溃的事情。谢谢!
【解决方案2】:

你的代码实际上是崩溃的就行了:

while (que.front() <= cut)

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

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 2013-02-27
    • 1970-01-01
    • 2016-06-14
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    相关资源
    最近更新 更多