JiaHeng-DLUT
8/5/2019 - 10:56 AM

Expression: invalid comparator

Expression: invalid comparator

使用 stl 中的 sort() 函数进行排序时,若数组中存在相同元素,则当 a==b 时必须返回 false,返回 true 则会报错如下:

原因在于 Visual Studio 中的 sort() 函数使用的是 strict weak orderings,详见 Strict weak orderings

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

bool comp1(const int& a, const int& b) {
    if (a > b) {
        return true;
    }
    else if (a < b) {
        return false;
    }
    // return true; // Error
    return false;
}

bool comp2(const int& a, const int& b) {
    // return a >= b; // Error
    return a > b;
}

int main() {
    vector<int> v1 = { 1, 5, 5, 2, 7 };
    vector<int> v2(v1);

    for (auto val : v1) {
        cout << val << " ";
    }
    cout << endl;
    // 1 5 5 2 7
    sort(v1.begin(), v1.end(), comp1);
    for (auto val : v1) {
        cout << val << " ";
    }
    cout << endl;
    // 7 5 5 2 1
    
    for (auto val : v2) {
        cout << val << " ";
    }
    cout << endl;
    // 1 5 5 2 7
    sort(v2.begin(), v2.end(), comp2);
    for (auto val : v2) {
        cout << val << " ";
    }
    cout << endl;
    // 7 5 5 2 1
}

References