C++ 自定义排序函数中的堆溢出

C++ 自定义排序函数中的堆溢出,c++,sorting,C++,Sorting,嗨,我很难用简单的程序对整数数组进行lex排序 完整程序如下: 对足够大的整数向量运行sort会导致数组中出现随机数,然后取决于导致segfault的数据 sort(nums.begin(), nums.end(), lex_compare); 要比较的函数: bool lex_compare(const int &a, const int &b) { int ap = a, bp = b; vector<int> da, db; if (

嗨,我很难用简单的程序对整数数组进行lex排序

完整程序如下:

对足够大的整数向量运行sort会导致数组中出现随机数,然后取决于导致segfault的数据

sort(nums.begin(), nums.end(), lex_compare);
要比较的函数:

bool lex_compare(const int &a, const int &b) {
    int ap = a, bp = b;
    vector<int> da, db;

    if (ap == 0) da.insert(da.begin(), ap%10);
    while (ap > 0) {
        da.insert(da.begin(), ap%10);
        ap /= 10;
    }
    if (bp == 0) db.insert(db.begin(), bp%10);
    while (bp > 0) {
        db.insert(db.begin(), bp%10);
        bp /= 10;
    }
    size_t size;
    if (da.size() < db.size()) {
        size = da.size();
    } else {
        size = db.size();
    }

    for (size_t i = 0; i < size; ++i)
        if (da[i] > db[i])
            return true;
        else if (da[i] < db[i])
            return false;
        else
            continue;

    if (da.size() > db.size())
        return false;
    else
        return true;
}
这实际上是lex_比较函数的第一行:

int ap = a, bp = b;

我无法找出导致这种行为的错误类型?这是由于比较函数的大小造成的吗?还是我有一些明显的内存读取错误?我使用的是clang 4.2.1,但其他平台也导致了相同的行为,因此我认为排序函数存在根本性错误。

您的问题是违反了传递给std::sort的比较函数必须遵循的规则

比较要求要求,如果compa,b==true,那么compb,a==false,但是您的比较函数不这样做。例如,如果a=0,b=0,则compa,b会将您带到

if (da.size() > db.size())
    return false;
else
    return true;
比较函数的一部分。由于大小相等,因此返回true。当我们翻转它并计算compb,a时,我们得到相同的块并再次返回true


当a==b时,您需要返回false,而您不需要这样做。

对于375的rep,此时您应该知道不应该使用pastebin链接。+用于重新产生此堆缓冲区溢出的输入丢失。为什么会有这么多复杂的代码而不是返回std::to_stringaif (da.size() > db.size()) return false; else return true;