STL容器有很多函数需要确定两个值是否相同,这些函数是以不同方式来判断两个值是否相同。
find对相同的定义是相等,是以operator==为基础的。
set::insert对相同的定义是等价,是以operator<为基础的。
相等的概念是基于opetator==的,但应该记住,x和y有相等的值不一定意味着它们的所有数据成员都有相等的值。如下举例:
class Widget {
public:
...
private:
TimeStamp last;
...
};
bool operator==(const Widget& lhs, const Widget& rhs)
{
// 忽略last成员的比较
}
这种情况下,两个Widget即使有不同的last成员,它们也是相同的。
等价的概念是基于operator<的,对于两个对象x和y,如果按照关联容器的排序,每个都不在另一个前面,那么称这两个对象按照关联容器的排列顺序等价。例如set的operator <:
!(w1 < w2) && !(w2 < w1)
两个值中任何一个都不在另一个前面,则这两个值是等价的。
那么,为什么标准关联容器是基于等价而不是相等的呢?因为标准关联容器是保持排列顺序的,所以每个容器必须有一个比较函数(默认less)来决定保持怎样的顺序。
注意,对于非标准的基于散列表的关联容器,有两种常见设计,一种基于相等的,一种基于等价的。