美文网首页
Effective STL 第19条

Effective STL 第19条

作者: 懒生活 | 来源:发表于2022-09-26 22:49 被阅读0次

理解相等于等价
相等的基础是 == , 如果x==y成立,就说明x和y的值相等
对于有顺序关系的容器, 为了顺序的存在,他的比较函数是必须定义的. 在比较函数已经存在的情况下,可不可以不借助==实现两个对象是否等价的判断. 假定某个容器的默认比较函数是<, 那么obj1和obj2 是否相等的判断可以用if(!(obj1>obj2) && !(obj2<obj1)) 实际上这个逻辑关系就是if(obj1==obj2), 只不过if(!(obj1>obj2) && !(obj2<obj1)) 的表达复用了比较函数.

假定你创建一个set<string, cistringcompare> strSet,这个set 因为排序函数cistringcompare不区分大小写,所以他判断相等的时候也不区分大小写.
那么当你执行下面两行代码的时候,实际上只有第一个"ABC"被插入了. 第二个"abc"被strSet通过比较函数组成的等价判断,判定为相等,所以不会加入.

strSet.insert("ABC");
strSet.insert("ABC");

对于这种容器,如果你用容器自带的find, strSet.find("ABC") 或者 strSet.find("abc")都能找到值,因为对于这个容器,这个容器的比较函数决定了不区分大小写的特性. 但是如果你用std::find去找这个容器的元素,就只能找到"ABC"而找不到"abc", 因为std::find是基于==来进行相等判断的.

那么标准关联容器为什么不增加一个基于==的相等判断的. 原因是这样的,假定你为strSet又引入一个相等的函数,相等用==,比较用<.
那"ABC","abc" 在插入的时候,根据==,确定是不重复的,都会被加入容器,但容器在排序的时候无法区分他们. 这样的矛盾不可调和. 对于标准关联容器,希望不同的东西就一定能比较出一个顺序出来.

相关文章

  • EFFECTIVE+STL中文版:50条有效使用STL的经验

    《Effective STL中文版:50条有效使用STL的经验》是EffectiveC++的第3卷,被评为“值得所...

  • 常用的 STL 查找算法

    常用的 STL 查找算法 《effective STL》中有句忠告,尽量用算法替代手写循环;查找少不了循环遍历,在...

  • Effective STL 第7条

    容器中的对象如果是指针,指针指向的资源,容器没有办法自动释放. 问题引出 容器在自己析构的时候,会把包含的对象逐个...

  • Effective STL 第28条

    正确使用reverse_iterator对于任何一个容器, 使用iterator, 你只可能正向正序访问容器内部的...

  • Effective STL 第22条

    主要不要修改set mutipleSet的key

  • Effective STL 第30条

    如果是区间操作,注意确保容器具有足够的区间 这个很矛盾, 我们害怕使用数组,就是因为数组有可能越界.为了不去考虑数...

  • Effective STL 第31条

    准确的选择排序算法 如果要对一个数列进行完全的排序,那么用sort是个不错的选择.但是如果只是部分排序, 要考虑更...

  • Effective STL 第34条

    为什么有些算法需要排序的区间 binary_search算法是二分查找, 这种查找需要查找空间的序列是有序的. 为...

  • Effective STL 第19条

    理解相等于等价相等的基础是 == , 如果x==y成立,就说明x和y的值相等对于有顺序关系的容器, 为了顺序的存在...

  • Effective STL 第25条

    散列表: 用key可以作为索引快速找到对应的value. 且这些对象在容器里面不排序. 散列表和标准关联容器set...

网友评论

      本文标题:Effective STL 第19条

      本文链接:https://www.haomeiwen.com/subject/psavortx.html