- 论坛徽章:
- 0
|
和multimap)的一部分——排序顺序方面有意义。两个对象x和y如果在关联容器c的排序顺序中没有哪个排在
另一个之前,那么它们关于c使用的排序顺序有等价的值。这听起来很复杂,但实际上,它不。考虑一下,
举一个例子,一个set<Widget> s。两个Widget w1和w2,如果在s的排序顺序中没有哪个在另一个之前,那么关
于s它们有等价的值。set<Widget>的默认比较函数是less<Widget>,而默认的less<Widget>简单地对Widget调用
operator<,所以w1和w2关于operator<有等价的值如果下面表达式为真:
!(w1 < w2) // w1 < w2时它非真
&& // 而且
!(w2<w1) // w2 < w1时它非真
这个有意义:两个值如果没有哪个在另一个之前(关于某个排序标准),那么它们等价(按照那个标准)。
在一般情况下,用于关联容器的比较函数不是operator<或甚至less,它是用户定义的判断式。(关于判断式的
更多信息参见条款39。)每个标准关联容器通过它的key_comp成员函数来访问排序判断式,所以如果下式求
值为真,两个对象x和y关于一个关联容器c的排序标准有等价的值:
!c.key_comp()(x, y) && !c.key_comp()(y, x) // 在c的排序顺序中
// 如果x在y之前它非真,
// 同时在c的排序顺序中
// 如果y在x之前它非真
表达式!c.key_comp()(x, y)看起来很丑陋,但一旦你知道c.key_comp()返回一个函数(或一个函数对象),丑
陋就消散了。!c.key_comp()(x, y)只不过是调用key_comp返回的函数(或函数对象),并把x和y作为实参。然
后对结果取反,c.key_comp()(x, y)仅当在c的排序顺序中x在y之前时返回真,所以!c.key_comp()(x, y)仅当在c的
排序顺序中x不在y之前时为真。
要完全领会相等和等价的含义,考虑一个忽略大小写的set<string>,也就是set的比较函数忽略字符串中字符
大小写的set<string>。这样的比较函数会认为“STL”和“stL”是等价的。条款35演示了怎么实现一个函数,
ciStringCompare,它进行了忽略大小写比较,但set要一个比较函数的类型,不是真的函数。要天平这个鸿
沟,我们写一个operator()调用了ciStringCompare的仿函数类:
struct CIStringCompare: // 用于忽略大小写
public // 字符串比较的类;
binary_function<string, string, bool> { // 关于这个基类的信息
// 参见条款40
bool operator()(const string& lhs,
const string& rhs) const |
|