С++ stable_sort не стабилен?

Я использую C++ stable_sort для сортировки вектора объектов моего класса в порядке возрастания с помощью функции сравнения, но сортировка нестабильна. Обходной путь, который сработал, заключался в обратной итерации и изменении логики в компараторе. Но не могу понять, почему он не должен нормально работать. Код:

using namespace std;
class Pair{
    string str;
    int num;
public:
    Pair(string s, int n):str(s), num(n)
    {}
    Pair(const Pair &a)
    {
        str = a.str;
        num = a.num;
    }
    int Num()
    {
        return num;
    }
    string Str() const{
        return str;
    }
    void set(string s, int n)
    {
        str = s;
        num=n;
    }
    void print() const{
        cout<<"\n"<<num<<" "<<str;
    }
};

bool comparator( Pair a,  Pair b)
{
    return a.Num()<=b.Num();
}

int main() {
    int n;
    cin >> n;
    vector<Pair> arr;
    for(int a0 = 0; a0 < n; a0++){
        int x;
        string s;
        cin >> x >> s;
        if((a0+1)<=n/2)
            s="-";
        Pair p(s, x);
        arr.push_back(p);
    }
    cout<<"\n Before sort";
    for(auto i:arr)
        i.print();

    stable_sort(arr.begin(), arr.end(), comparator);
    cout<<"\n\n After sort";
    for(auto i:arr)
        i.print();

    return 0;
}

Результат: перед сортировкой 0 - 6 - 0 - 6 - 4 - 0 - 6 - 0 - 6 - 0 - 4, что 3 будет от 0 до 1 будет 5 вопрос 1 или 2 не 4 будет от 2 до 4

После сортировки от 0 до 0 - 0 - 0 - 0 - 0 - 1 или 1 будет от 2 до 2, а не 3 будет 4, 4 будет 4, что 4 - 5 вопрос 6 - 6 - 6 - 6 -


person Aman    schedule 29.04.2018    source источник
comment
Не могли бы вы предоставить желаемый результат (путем редактирования вопроса)?   -  person DeiDei    schedule 29.04.2018
comment
Пожалуйста, запустите вашу программу, введите ее и посмотрите, что она выводит. Затем скопируйте и вставьте этот ввод и вывод прямо из окна консоли в вопрос. И добавьте результат, который вы ожидали.   -  person Some programmer dude    schedule 29.04.2018
comment
comp(a,a) должно быть ложным. См. соответствующие документы.   -  person Baum mit Augen    schedule 29.04.2018
comment
stable_sort является стабильным, если ваша функция сравнения работает по правилам и реализует строгий слабый порядок — если вы этого не сделаете, все ставки сняты.   -  person Jesper Juhl    schedule 29.04.2018


Ответы (1)


comp - объект функции сравнения (т.е. объект, удовлетворяющий требованиям Compare), который возвращает ​true, если первый аргумент меньше (т.е. упорядочен раньше) второго.

из stable_sort. Компаратор должен реализовать строгий слабый порядок. См. также здесь таблицу с точными требованиями.

Ваш компаратор неверен, он также возвращает true для равных элементов.

person yassin    schedule 29.04.2018
comment
Вы можете упомянуть строгий слабый порядок/строгий общий порядок и, возможно, процитировать определение. - person Jesper Juhl; 29.04.2018
comment
Спасибо, Ясин, это была проблема. отсортировано. - person Aman; 29.04.2018