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

来源:互联网 发布:gh0st 源码下载 编辑:程序博客网 时间:2024/05/24 06:58
#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
原创粉丝点击