Я использую 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 —
comp — объект функции сравнения (то есть объект, который удовлетворяет требованиям Compare), который возвращает истину, если первый аргумент меньше (т.е. упорядочен раньше) второго.
от stable_sort. Компаратор должен реализовать строгий слабый порядок. Смотрите также Вот для таблицы точных требований.
Ваш компаратор неверен, он также возвращает true для равных элементов.
Других решений пока нет …