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

#include<iostream>
#include<set>
#include<map>
#include<algorithm>
#include<functional>
#include<iterator>

using namespace std;

int main()
{
    set<int, less_equal<int>> s;//s采用“<=”来排序

    s.insert(10);
    //s.insert(10);//插入两个10后将引起不明确的行为
    /*
    因为less_equal采用的是<=,因此集合会检查下边的表达式是否为真:
    !(10a<= 10b)&&!(10b<=10a)
    结果为false&&false 为false
    也就是说,10a和10b是不等价的,从而不相同,因此10b会插入到10a的旁边
    ,会导致不明确的行为,但是更普遍的后果是,会导致集合中有10的两份拷贝,这意味着他不是
    一个集合!即破坏了set容器
    */
    //ostream_iterator的头文件是iterator
    copy(s.begin(), s.end(), ostream_iterator<int>(cout, "\n"));
    return 0;
}

总结的3点:

1、保证对关联容器所使用的比较函数总是要对相等返回false.
2、比较函数的返回值表明的是按照该函数定义的排列顺序,一个值是否在另一个值之前。相等的值从来不会有前后顺序关系,所以,对相等的值,比较函数应当始终返回false.
3、除非你的比较函数对相等的值总是返回false,否则你会破坏所有的标准关联容器,不管他们是否允许存储重复的值。
4、任何定义了“严格的弱序化”的函数必须对相同的的两个拷贝返回false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值