2009-08-06 56 views
1

从cplusplus.com:STL集的两个元素何时被认为是相同的?

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

“比较:比较类:A类,是以相同的类型容器元件的两个参数,并返回一个布尔表达式排版(A,B),其中补偿是这个比较类的一个对象,a和b是容器的元素,如果在严格的弱排序操作中将a放置在比b更早的位置,它将返回真,它可以是实现函数调用操作符的类或一个指向函数的指针(参见构造函数举例),默认为less,这与应用小于运算符(a < b)相同返回 set对象使用此表达式来确定元素的位置在th e容器。 “

假设比较类用于决定两个对象中的哪一个是”较小“还是”较小“,那么类将如何检查两个对象是否是两个元素是相等的(例如,以防止插入相同的元素两次)?

我可以想象这里有两种方法:一种是在后台调用(a == b),但不提供重写此比较的选项( (默认值越小越好)对我来说似乎不太对,另一种假设是(a == b)==!(a < b)& &!(b < a);那就是如果两者都不相等,则认为两个要素相等是比其他的“少”,但不知何故,这也不适合我,因为比较可以是任意复杂类的对象之间的任意复杂的布尔函子。

那么它是如何做到的?

回答

3

不是一个确切的重复,但第一个答案here回答您的问题

你的第二个猜测的行为是正确的

0

你的第二个选择是正确的。为什么感觉不对?如果平等测试与您给出的等式不一致,您会怎么做?

3

标准库关联容器中等价键的术语定义,不等于本身

由于并非所有setmap实例使用less,但可以使用一个通用的比较操作有必要在这一个比较函数来定义等价而不是试图引入一个独立的平等概念。

通常,两个键(​​和k2)以相关联的容器使用比较功能comp是等价的,当且仅当:

comp(k1, k2) == false && comp(k2, k1) == false 

在使用std::less用于类型的容器不具有该具体的std ::专业化少,这意味着相同的:

!(k1 < k2) && !(k2 < k1) 
1

你的错误是假设“的比较可以是任意复杂的布尔函子”。它不能。

std::set需要部分排序,以便a<b暗示!(b<a)。这排除了大多数二进制布尔函子。因此,我们可以讨论a和b在该顺序中的相对位置。如果a<b,则位于b之前。如果b<a,b先于a。如果既没有a<b也没有b<a,那么a和b在排序中占据相同的位置并且因此是等同的。

相关问题