неверный оператор <при сортировке std :: list - PullRequest
19 голосов
/ 16 декабря 2011

У меня есть ребра графа std :: list, и я хочу отсортировать ребра, основываясь на их конечной степени, а затем на их степени. Но я получаю исключение недопустимого оператора <во время моей функции сравнения ниже мой код. Мой список содержит указатели на края и ребра имеют узлы назначения в качестве своих членов. </p>

bool compareEdges(const Edge  *e1,const Edge *e2){
if(e1->destination->outdegree < e2->destination->outdegree){
    return true;
}
else if(e1->destination->outdegree > e2->destination->outdegree){
    return false;
}
else if(e1->destination->indegree > e2->destination->indegree){
        return false;
    }
return true;

}

А вот и вызов функции сортировки.

currentNode->edgeList.sort(compareEdges);

Пожалуйста, помогите мне удалить это исключение.

enter image description here

Спасибо

1 Ответ

32 голосов
/ 16 декабря 2011

Ваш компаратор возвращает true, когда оба соответствующих поля равны. Это неверно, поэтому вполне может быть, что реализация sort обнаружена с помощью assert.

Вы должны передать предикат "меньше чем" в sort: формально "строгий слабый порядок". Все остальное - неопределенное поведение. Кажется, в этом случае вам повезло, и реализация обнаруживает, что попала в невозможную ситуацию из-за непоследовательных сравнений.

...