# Effective STL： Item 21：永远让比较函数对相同元素返回false

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Item 21：永远让比较函数对相同元素返回false

set<int, less_equal<int> > s;               // s is sorted by <=

s.insert(10);                               // insert the value 10

s.insert(10);

set遍历它的内部数据结构以查找加入10B的位置。 最终，它总要检查10B是否与10A相同。 关联容器对“相同”的定义是equivalence(见Item 19)（WQ注： equivalence应指“数学相等”，two elements are equal if neither is less than the other，见《The C++ Standard Library》中文版P82，英文版电子P77；equality指“逻辑等价”，使用operator==()，见《The Standard Template Library》英文电子版P30)因此set测试10B是否数学等值于10A。 当执行这个测试时，它自然是使用set的比较函数。在这一例子里，是operator<=，因为我们指定set的比较函数为less_equal，而less_equal就是operator<=。于是，set将计算这个表达式是否为真：

!(10 A <= 10 B ) && !(10 B <= 10 A )       // test 10 A and 10 B for equivalence

!(true) && !(true)

false && false

struct StringPtrGreater:                             // highlights show how

public binary_function<const string*,            // this code was changed

const string*,            // from page 89. Beware,

bool> {                   // this code is flawed!

bool operator()(const string *ps1, const string *ps2) const

{

return !( *ps1 < *ps2);                      // just negate the old test;

}                                                // this is incorrect!

};

struct StringPtrGreater:                             // this is a valid

public binary_function<const string*,            // comparison type for

const string*,            // associative containers

bool> {

bool operator()(const string *ps1, const string *ps2) const

{

return *ps2 < *ps1;                          // return whether *ps2

}                                                // precedes *ps1 (i.e., swap

// the order of the

};                                                   // operands)

multiset<int, less_equal<int> > s;             // s is still sorted by <=

s.insert(10);                                  // insert 10 A

s.insert(10);                                  // insert 10 B

• 本文已收录于以下专栏：

## effective stl 第21条：总是让比较函数在等值情况下返回false

#include #include #include #include #include #includeusing namespace std;int main() { set s;//s采...
• u014110320
• 2016年09月22日 20:12
• 316

## C++中关于set的自定义排序函数的书写

• lishuhuakai
• 2016年05月14日 09:07
• 6862

## 关联容器：永远让比较函数对相等的值返回false

• wangdamingll
• 2016年12月13日 10:12
• 194

## Effective STL 条款21: 关联容器的strict weak order(让比较函数对相等的值返回false)

条款21: 永远让比较函数对相等的值返回false让我向你展示一些比较酷的东西。建立一个set，比较类型用less_equal，然后插入一个10：set > s; // s以“...
• bichenggui
• 2009年10月20日 21:38
• 5444

## 重构的小技巧

1. CSS3对话框 .talk{width: 100px; height: 30px; background: #ffffff; border-radius: 5px; position: ab...
• hao452378531
• 2016年05月10日 10:06
• 696

• Innost
• 2015年09月05日 20:07
• 130505

## 火眼睛睛查coredump(stl sort)------永远让比较函数对相同元素返回false

• zgaoq
• 2017年07月08日 16:33
• 274

## 火眼睛睛查coredump(stl sort)------永远让比较函数对相同元素返回false

• stpeace
• 2016年04月02日 00:19
• 3124

## oracle分析函数

• caohongshuang
• 2017年08月31日 21:01
• 127