2015-11-10 8 views
1

С std::set реализован как двоичное дерево, как он сравнивает std::string для неравенства? Это похоже на a < b && b < a?std :: набор реализации std :: string неравенства

Используется ли длина строки напрямую или она хеширует ее каким-то образом? Действительно ли это гарантирует уникальность строк?

+3

std :: string больше, равно, меньше и т. Д., См .: http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp – fghj

+0

@ user1034749, что это имеет отношение к вопросу? – SergeyA

+0

@ user263688 'a LogicStuff

ответ

2

std::set использует less для сортировки его ключей. Это operator< на std::string, который сравнивает строки лексикографически.

+3

Интересно, почему ответ, который явно не отвечает на вопрос, принимается :) – SergeyA

5

Он просто делает меньше дважды - свопинг влево и вправо для второго сравнения. Если оба возвращают false, строки считаются равными.

И да, это гарантирует уникальность его членов (включая строки), если оператор меньше выполняет то, что ожидается для типов членов (что, конечно, верно для строк, но может быть не так верно для определяемые пользователем типы).

+0

Он не может гарантировать уникальность. Это может гарантировать только * эквивалентность * в том, что касается оператора сравнения. Для 'std :: set ' это означает, что эквивалентность подразумевает равенство содержимого строки, но не количество выделенной памяти, например. – Walter

+0

@Walter я не понимаю этого. Не могли бы вы привести пример, когда элемент появляется дважды в наборе? Вы говорите, что если выделенная память отличается, то вы могли бы это сделать? Мне, должно быть, не хватает чего-то, чего я думаю. – dingalapadum

+0

@Walter Конечно, это гарантирует эквивалентность, вот что вам нужно. Вы не (по умолчанию) хотите, чтобы строка отображалась дважды в наборе только потому, что объем памяти, используемой для хранения информации, отличается. Если вы хотите такое поведение, вы просто укажете другую функцию сравнения, которая будет использоваться для 'std :: set'. – SirGuy