effective stl 第19条:理解相等(equality)和等价(equivalence)的区别

#include<iostream>
#include<map>
#include<set>

using namespace std;

bool ciStringCompare(const string l, const string r)
{
    //该函数是对字符串不分大小写的进行比较

    return true;
}

int main()
{

    /*
    关联容器会自动排序,它们按照等价而不是相等的标准来对待自己的内容;
    set和map不允许有重复的项目;
    map和multimap通常忽略它所包含的每个对象中的一半;

    STL中没有基于散列表的容器,但是尽管STL中没有散列表,但是不用自己实现,已经有高质量的实现了
    */

    //find算法和set的insert成员函数是两个有代表性的函数,在STL中有很多这样的函数,
    //他们需要确定两个值是否相同,find对相同的定义是相等,是以operator==为基础的
    //set::insert对相同的定义是等价,是以operator<为基础的

    //相等的概念是基于operator==的,如果表达式x==y返回为真,则x与y相等,否则就不等了
    //但是x与y有相等的值不一定意味着x和y的所有数据成员都有相同的值。

    /*
    等价关系是以"在已排序的区间对象值的相对顺序"为基础的。对于两个对象x,y 如果按照关联容器c的排列顺序,
    每个都不在另一个的前面,那么称这两个对象按照c的排列顺序有等价的值
    */

    /*
    在一般的情况下,一个关联容器的比较函数并不是operator<,甚至不是less,他是用户自定义的判别式
    每个关联容器都是通过key_map成员函数使判别式可在外部被使用,因此如果下边的表达式为true,两个对象
    x和y是等价的
    */
    set<string> c;
    if (!c.key_comp()("X","x" ) && !c.key_comp()("x", "X"))
        return true;

    /*
    假设不区分大小写的set<string> ,即STL与stl看作是等价的。
    */
    struct CIStringCompare :
        public
        binary_function<string, string, bool>{//该基类的信息参加第40条
        bool operator()(const string& lhs, const string& rhs) const{
            return ciStringCompare(lhs, rhs);
        }
    };

    set<string, CIStringCompare> ciss;
    ciss.insert("Persephone");//插入大写的的字符串
    ciss.insert("persephone");//插入小写的字符串
    //只有第一个会被插入,因为Persephone和persephone等价

    //如果使用set的成员函数find来查找字符串"persephone",则会查找成功
    if (ciss.find("persephone") != ciss.end());

    //但是如果使用非成员函数的find算法,则查找将会失败
    if (find(ciss.begin(), ciss.end(), "persephone") != ciss.end());
    //这是因为Persephone和persephone等价,但是并不相等,因为string("persephone")!=string("Persephone")

    //对于非标准的基于散列表的关联容器,有两种常见的设计,一种是基于相等的,一种是基于等价的。




    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值