как перегрузка оператора работает в сортировке в cpp? - PullRequest
1 голос
/ 12 июня 2019

Я знаю компараторы для сортировки, я знаю, что comp (x, y) должен верните true, чтобы получить порядок .., x, ...., y .. в векторе.

bool comp(int x,int y){
    return occurences[x]<occurences[y];
}

рода (data.begin (), data.end (), CMP); согласно x будет следовать за y в векторе (... x..y ..)

Но недавно я узнал о То же самое, используя перегрузку оператора, в отношении которой у меня есть некоторые сомнения.

struct Edge{
    int u,v,weight;
    bool operator < (Edge const& other){
       return weight < other.weight;
    }
}

1) будет ли он работать так же, как здесь, если вес текущего ребра

2) И что будет первым, я имею в виду выше в вышеуказанном формате comp (x, y), верните true тогда x придет первым Но каковы критерии здесь, потому что кажется, что мы передают только аргумент здесь в функции перегрузки оператора. Например, если мы сравним Edge1 (вес = 40)

Ответы [ 2 ]

1 голос
/ 12 июня 2019

При объявлении функции-члена класса существует «невидимый» первый аргумент: this

Итак, вне класса функция выглядит примерно так:

bool operator < (const Edge* this, Edge const& other)
        { return this->weight < other.weight; }

Таким образом, левая (первая) переменная всегда равна this, а правая (вторая) переменная - other.

Другой способ взглянуть на это так, как предложил Аконкагуа:

Выражение x < y сопоставлено с Edge x, y; x.operator<(y); - это явный вызов оператора.

Подробнее о перегрузке операторов: Каковы основные правила и идиомы перегрузки операторов?

0 голосов
/ 12 июня 2019

Если вы не предоставите std::sort пользовательский компаратор, то диапазон будет отсортирован путем сравнения элементов с использованием operator<.

Логически, между двумя версиями существует только разница в одну строкуиз std::sort:

if (obj1 < obj2) {

против

if (cmp(obj1, obj2)) {

В обоих случаях объекты будут отсортированы так, что для любого объекта obj1, отсортированного перед другим объектом obj2, сравнениевернет true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...