在C ++中,std :: set :: insert()仅在没有具有相同“value”的值时才插入值。同样,这是指算子==还是它意味着哪个算子<对于任何一个订购都是假的,或者它是否意味着别的什么?
答案 0 :(得分:5)
是否意味着哪个运营商<对于任何一个订购都是假的吗?
是,如果该集使用默认比较器并使用<
比较密钥。更一般地,在具有比较器Compare
的有序容器中,如果k1
,则将两个键k2
和!Compare(k1,k2) && !Compare(k2,k1)
视为等效。
不需要密钥来实现operator==
或其他任何内容;他们只需要使用容器的比较器来比较strict weak ordering。
答案 1 :(得分:2)
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>
,其值无意义。< / p>
答案 2 :(得分:1)
set
允许在T
上执行的唯一比较是通过其作为模板一部分进行比较的仿函数类型。因此,这就是它如何定义等价。
对于set
中的每个值,对于该值与新值之间的两个排序之一,比较必须评估为true。如果任何值的两种方式都是假的,那么就不会存储它。