C ++: Как set узнает, когда два элемента равны? - PullRequest
4 голосов
/ 25 декабря 2010

Я создал набор C-строк, предоставив собственную функцию сравнения, потому что я хотел, чтобы она учитывала только первые три символа.Вот его определение:

struct set_object {
 bool operator()(const char* first, const char* second) {
        return strncmp(first, second, 3) > 0;
 }
};
std::set<const char*, set_object> c_string_set;

Это работает так, как я хотел, сортируя строки по мере их добавления так, как я обрисовал в общих чертах в классе set_object.Но интересная часть начинается, когда я пытаюсь добавить строку, которая сравнивается с уже добавленной строкой.Например, если я пытаюсь добавить «aaab», когда в наборе уже есть «aaa», он не добавляется в набор.Если я сначала добавлю «aaab», а затем попробую добавить «aaa», в нем будет только «aaab».Но как он узнает, когда они равны , если я только предоставил функцию, которая возвращает true, когда одна из строк больше?Он должен возвращать false, когда он или равен или меньше!

Для пояснения, это не проблема, просто попытаться выяснить, как работает C ++.

Ответы [ 4 ]

5 голосов
/ 25 декабря 2010

Вы правы, что set_object(x, y), возвращая false, не говорит, меньше ли x чем y или они равны Поэтому установите, затем звоните set_object(y, x), чтобы узнать.

2 голосов
/ 25 декабря 2010
if (!less(first,second) && !less(second,first)) // equivalent!

Если ни один из них не меньше другого, они эквивалентны (не равны, есть очень тонкая разница).

0 голосов
/ 25 декабря 2010

Элементы считаются эквивалентными , если a<b и b<a оба false.

См. http://www.sgi.com/tech/stl/StrictWeakOrdering.html.

0 голосов
/ 25 декабря 2010

Если элемент x не больше и не меньше, чем другой элемент y.это означает, что x и y - это одно и то же ...

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