#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;
}
effective stl 第19条:理解相等(equality)和等价(equivalence)的区别
最新推荐文章于 2022-05-17 18:57:14 发布