В C ++ std :: set :: insert () вставляет значение только в том случае, если его еще нет с таким же значением. К тому же, означает ли это оператор == или это означает, для какого оператора< является ложным для любого заказа, или это означает что-то еще?
это означает тот, для которого оператор< ложно для любого заказа?
Да, если набор использует компаратор по умолчанию и сравнивает ключи, используя <
, В общем, в заказанном контейнере с компаратором Compare
две клавиши k1
а также k2
рассматриваются как эквивалент если !Compare(k1,k2) && !Compare(k2,k1)
,
Ключи не требуются для реализации operator==
или что-нибудь еще; они просто должны быть сравнимы, используя компаратор контейнера, чтобы дать строгий слабый порядок.
станд :: набор имеет аргумент шаблона с именем `Compare ‘, как в этой подписи:
template < class Key, class Compare = less<Key>,
class Allocator = allocator<Key> > class set;
Compare
используется для определения порядка между элементами. Здесь по умолчанию less<Key>
использует <
оператор для сравнения двух ключей.
Если это помогает, вы можете думать о наборе как о std::map
с бессмысленными значениями, т.е. std::set<int>
можно рассматривать как std::map<int, int>
где значения не имеют смысла.
Единственное сравнение, которое set
разрешено выступать на T
через тип функтора было дано сделать сравнение как часть шаблона. Таким образом, именно так он определяет эквивалентность.
Для каждого значения в set
сравнение должно иметь значение true для одного из двух порядков между этим значением и новым. Если это ложно в обоих направлениях для любого значения, то оно не будет сохранено.