在C++中,std::set::insert() 只有在还没有具有相同"值"的值时才插入一个值。 同样,这是否意味着运算符==,或者它是否意味着哪个运算符<对于排序是错误的,还是意味着其他东西?>
这是否意味着哪个运算符<对于任一排序都是错误的?>
是的,如果集合使用默认比较器并使用<
比较键。更一般地说,在具有比较器Compare
的有序容器中,如果!Compare(k1,k2) && !Compare(k2,k1)
,两个键k1
和k2
被视为等价。
实现operator==
或其他任何东西都不需要密钥;它们只需要使用容器的比较器进行比较,以给出严格的弱排序。
std::set 有一个名为 '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。如果任何值的双向都为 false,则不会存储它。