【问题标题】:std::sort ( from <algorithm> ) crashesstd::sort (来自 <algorithm> )崩溃
【发布时间】:2013-11-03 19:42:38
【问题描述】:

下面的程序是一个简单的向量排序程序,在第二次排序调用中 t >= 17 时崩溃。即使 t == 100,第一次排序也会成功。 挣扎了很长一段时间,但我无法弄清楚出了什么问题。有人可以帮帮我吗?

我已经在 MacBook Air 和 linux 机器上尝试过,令人惊讶的是,我看到了相同的结果。

#include<iostream>
#include<vector>
#include<algorithm>

    using namespace std;
    struct tc
    {
        unsigned int n;
    };
    bool sort_by_n( tc a, tc b )
    {
        return a.n <= b.n;
    }
    vector<tc> tcv(100);
    vector<int> tv(100);
    int main()
    {
        unsigned int t;
        cin >> t;
        for ( unsigned int i = 0 ; i < t ; i++ )
        {
            cin >> tcv[i].n;
            tv[i] = tcv[i].n;
        }
        sort( tv.begin(), tv.begin()+t); // ## This one works even for t == 100.
        sort( tcv.begin(), tcv.begin()+t, sort_by_n ); // ## This one crashes for t >= 17
        return 0;
    }

【问题讨论】:

    标签: c++ linux stl stl-algorithm


    【解决方案1】:

    您需要提供 strict 弱排序,但是

    bool sort_by_n( tc a, tc b )
    {
        return a.n <= b.n;
    }
    

    只是一个弱命令。如果元素相同,则严格的弱顺序必须返回false。您需要将其更改为:

    bool sort_by_n( tc a, tc b )
    {
        return a.n < b.n;
    }
    

    【讨论】:

    • 非常感谢丹尼尔。那行得通。我很惊讶它会导致这种行为。
    • @vrk001 排序算法可能会进入无限递归,直到它用完可用的堆栈空间然后崩溃。
    • 哦,我明白了。因此,对于排序大小 = 17,正是这种处理方式不那么宽容!谢谢你帮助我! :-)
    • @vrk001 我认为重要的不仅仅是大小,您可能会构建比会崩溃的案例更小的案例,而某些大于 17 的案例可能仍然有效。它不是真正可预测的,因为它取决于元素的初始顺序,当然,也取决于未完全指定的实现算法。
    • 你是对的。这不仅仅是大小。早些时候,我正在测试所有相等的元素进行排序。那时我只看到 t >=17 的崩溃。但是,现在,在您指出之后,我用所有不同的元素进行了测试,我发现它根本没有崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2018-08-04
    • 2021-05-14
    • 2021-06-18
    • 1970-01-01
    • 2016-01-18
    • 2014-02-14
    相关资源
    最近更新 更多