3

在 C++ 中,std::set::insert() 仅在没有具有相同“值”的值时插入一个值。同样,这是否意味着 operator== 或者它是否意味着 operator< 对于任何一个排序都是错误的,或者它是否意味着其他东西?

4

3 回答 3

5

这是否意味着对于哪个 operator< 对于任一排序都是错误的?

是的,如果集合使用默认比较器并使用<. 更一般地,在带有比较器的有序容器中Compare,两个键k1k2被视为等效if !Compare(k1,k2) && !Compare(k2,k1)

不需要密钥来实现operator==或其他任何东西;它们只需要使用容器的比较器进行比较即可给出严格的弱排序

于 2012-10-02T00:13:51.487 回答
2

std::set有一个名为 `Compare' 的模板参数,如下签名所示:

template < class Key, class Compare = less<Key>,
       class Allocator = allocator<Key> > class set;

Compare用于确定元素之间的顺序。这里,默认less<Key>使用<运算符来比较两个键。

如果有帮助,您可以将集合视为std::map具有无意义值的 a,即std::set<int>可以将 a 视为std::map<int, int>值无意义的 a。

于 2012-10-01T23:55:21.593 回答
1

唯一set允许执行的比较T是通过作为模板的一部分进行比较的仿函数类型。因此,这就是它定义等价的方式。

对于 中的每个值,对于set该值和新值之间的两个排序之一,比较必须评估为真。如果任何值都为假,那么它不会被存储。

于 2012-10-01T23:55:56.117 回答