STL中容器相等(equality)和等价(equivalence)的区别
来源:互联网 发布:软件功能测试流程 编辑:程序博客网 时间:2024/06/14 14:26
STL中相等(equality)与等价(equivalence)的区别
1.相等(equality) 【无序数据】
相等关系是以operator ==为基础的。
a与b相等: a == b
例子:find,count,count_if等等大部分函数
2.等价(equivalence) 【已序数据】
等价关系是以“在已排序的空间中对象值得相对顺序”为基础的。也就是说,如果两个值中任何一个(按照既定的排列顺序)都在另一个的前面,那么他们就是等价的。
a与b等价: !(a < b) && !(b < a) 或者更一般的(不是以默认的less<T>作为比较规则):
AssociativeContainer x;
! x.key_compare()(a,b) && !x.key_compare()(b,a)
例子:标准关系容器(已排序)set/multiset/map/multimap的成员函数;
binary_search,low_bound/upper_bound/equal_range函数。
3.例如:
#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
- STL中容器相等(equality)和等价(equivalence)的区别
- STL中相等(equality)与等价(equivalence)的区别
- STL中相等(equality)与等价(equivalence)的区别
- effective stl 第19条:理解相等(equality)和等价(equivalence)的区别
- stl中相等和等价的区别
- stl中相等和等价的区别
- 了解STL中相等和等价的区别
- STL 理解相等和等价的区别
- effective STL - 了解相等和等价的区别
- Effective STL第十九节 相等和等价的区别
- Custom comparison, equality and equivalence with the STL
- Effective STL 19 understand the difference between equality and equivalence
- 黑盒测试之等价划分法(Equivalence partitioning )
- Kotlin 其他(六) --- 相等性(Equality)
- 功能测试漫谈——等价类划分(Equivalence Class Partitioning)
- STL 中“相等”的概念
- C++中STL常用容器的区别
- C++中STL常用容器的区别
- 优化Linux下的内核TCP参数以提高系统性能
- <Android开源库> MPAndroidChart Wiki(译文)~Part 1
- mysql 中 find_in_set()
- android 传统蓝牙开发 (附示例源码)
- linux驱动调试之段错误分析-根据栈信息分析函数调用过程
- STL中容器相等(equality)和等价(equivalence)的区别
- 【Dubbo分布式服务框架】1.Dubbo基础介绍
- DNS域名系统解析过程
- Spark高级数据分析(1) ——纽约出租车轨迹的空间和时间数据分析
- 离散数学上机题目1(判断元素是否属于集合)
- 前端面试题总结
- python---异常处理2
- Soapui接口功能测试循环与嵌套循环
- linux下升级npm以及node