2011-06-02 4 views
3

Я столкнулся с проблемой всякий раз, когда пытался сортировать вектор объектов, что приводило к бесконечному циклу. Я использую пользовательскую функцию сравнения, которую я передал функции сортировки.C++ std :: vector std :: sort бесконечный цикл

Я смог исправить проблему, вернув false, когда два объекта были равны вместо true, но я не совсем понял решение. Я думаю, это потому, что моя функция сравнения нарушала это правило, как указано на cplusplus.com:

Сравнение функционального объекта, который, принимает два значения одного и того же типа , чем те, которые содержатся в диапазоне, возвращает истину, если первый аргумент предшествует второму аргументу в конкретным строгим слабым порядком его определяет и false в противном случае.

Может ли кто-нибудь предоставить более подробное объяснение?

+1

http://www.sgi.com/tech/stl/StrictWeakOrdering.html –

+0

Можете ли вы опубликовать свою функцию сравнения? – GWW

+0

Какие еще объяснения вам нужны? Это определение очень ясно. Если 'A' должно появиться перед' B' в упорядоченной последовательности, тогда 'A' ​​<' B' должно быть истинным. В противном случае это должно быть ложным. –

ответ

5

Правильный ответ, как указывали другие, заключается в том, чтобы узнать, что такое «строгий слабый порядок». В частности, если значение comp(x,y) истинно, то comp(y,x) должно быть ложным. (Обратите внимание, что это означает, что comp(x,x) неверно.)

Это все, что вам нужно знать, чтобы исправить вашу проблему. Алгоритм sort не дает никаких обещаний, если функция сравнения нарушает правила.

Если вам интересно, что на самом деле пошло не так, то в вашей библиотеке sort, вероятно, используется внутренняя утилита quicksort. Quicksort работает путем многократного поиска пары элементов «вне порядка» в последовательности и их замены.Если ваше сравнение сообщает алгоритму, что a, b «не соответствует порядку», и он также сообщает алгоритму, что b, a «не соответствует порядку», тогда алгоритм может сворачивать их снова и снова навсегда.

6

Если вы ищете подробное объяснение того, что «строгий слабый порядок» есть, вот некоторые хорошие материал для чтения: Order I Say!

Если вы ищете помощь фиксируя свой функтор сравнения, вам необходимо на самом деле опубликовать его.

+0

+1 Спасибо за эту ссылку. –

0

Strict weak ordering означает a < b == true, и когда вы возвращаете true для равенства, его значение равно < = b == true. Это требование необходимо для оптимальности для разных алгоритмов сортировки.

6

Если изделия одинаковые, то одни не идут перед другим. В документации было совершенно ясно, что в этом случае вы должны вернуть false.

+0

Указывая ложь, вы не технически говорите, что кто-то идет перед другим? Наверное, я не понял, почему это приводит к бесконечному циклу. –

+0

"возвращает true, если первый аргумент переходит к второму аргументу в конкретном строгом слабом порядке, который он определяет" –

+0

Вышеупомянутое означает "вернуть true тогда и только тогда, когда A

1

Алгоритм сортировки может легко зацикливаться, потому что вы говорите, что A < B И B < A, когда они равны. Таким образом, алгоритм может бесконечно пытаться поменять элементы A и B, пытаясь получить их в правильном порядке.

3

Фактическое правило указано в стандарте C++, в 25.3[lib.alg.sorting]/2

Сравнить используется в качестве функции объекта, который возвращает true, если первый аргумент меньше второго, и false в противном случае.

Случай, когда аргументы равны, подпадает под «в противном случае».