关联容器的比较函数的一点认识
2012-12-31 13:38
204 查看
这次学习C++ PRIMER中文第四版已经到第15章“面向对象编程”了。在15.8.3节,讲到使用带比较器的关联容器时,书本使用multiset容器来保存键,但是这里却用了2个:std::multiset。其中Sales_item是一个类,而Comp是一个比较函数的类型别名,该函数具体定义如下:
//具体的比较函数
//定义的该比较函数的别名,为函数指针
本来我以为,set容器不是只有键吗,也就是在尖括号内只有一种类型,而在这里却有两个,好生纳闷。于是,又把书本翻到第十章去,发现在默认情况下,由于关联容器需要一个严格弱排序,通常情况下默认调用<操作符进行比较,但是在有些类中,不大好定义小于操作符,就需要给出一个比较函数,在本例中也就是std::multiset<Sales_item, Comp>中的Comp。
但是还有个问题是,在multiset容器与set容器之间的区别上,有点不明白。既然set只是为表明某种键是否出现而已,而不附带相关值,那么multiset还有什么意义呢?它不想multimap那样可以一个键对应多个值。书本上没有关于multiset的详细介绍。我去问问度娘看。
如果,对于multiset类型允许两个相同的键,那么如何按照严格的弱排序进行排序呢?
例如multiset<int> imset。对于这个imset,如果我插入1、2、4、2、3、5、3、6,那么这个容器中将是如何?允许同个多次出现有多少意义呢?我的意思是说,multiset还有多少意义?不然用multimap就可以了。
当然了,这样的区分还是有意义的。对于map类容器,其必然需要2个构成要件,即键值对,而set容器只是单一的键,尽管在上述代码中,multiset包含了一个比较函数,但是这个比较函数并不是set的元素,只是排序需要的平台而已。就如上述输入来说,imset容器中的排序如下:
1
2
2
3
3
4
5
6
为单一类型,而若用multimap容器,则必须为这些int型配上对应的值。毫无疑问的是,有时候我们并不许需要这样的值,因此,multiset的这种同一个键多次出现的机制还是有其独立存在的价值的。
//具体的比较函数
inline bool compare(const Sales_item &lhs, const Sales_item &rhs) { return lhs->book() < rhs->book(); }
//定义的该比较函数的别名,为函数指针
typedef bool (*Comp) (const Sales_item&, const Sales_item&);
本来我以为,set容器不是只有键吗,也就是在尖括号内只有一种类型,而在这里却有两个,好生纳闷。于是,又把书本翻到第十章去,发现在默认情况下,由于关联容器需要一个严格弱排序,通常情况下默认调用<操作符进行比较,但是在有些类中,不大好定义小于操作符,就需要给出一个比较函数,在本例中也就是std::multiset<Sales_item, Comp>中的Comp。
但是还有个问题是,在multiset容器与set容器之间的区别上,有点不明白。既然set只是为表明某种键是否出现而已,而不附带相关值,那么multiset还有什么意义呢?它不想multimap那样可以一个键对应多个值。书本上没有关于multiset的详细介绍。我去问问度娘看。
如果,对于multiset类型允许两个相同的键,那么如何按照严格的弱排序进行排序呢?
例如multiset<int> imset。对于这个imset,如果我插入1、2、4、2、3、5、3、6,那么这个容器中将是如何?允许同个多次出现有多少意义呢?我的意思是说,multiset还有多少意义?不然用multimap就可以了。
当然了,这样的区分还是有意义的。对于map类容器,其必然需要2个构成要件,即键值对,而set容器只是单一的键,尽管在上述代码中,multiset包含了一个比较函数,但是这个比较函数并不是set的元素,只是排序需要的平台而已。就如上述输入来说,imset容器中的排序如下:
1
2
2
3
3
4
5
6
为单一类型,而若用multimap容器,则必须为这些int型配上对应的值。毫无疑问的是,有时候我们并不许需要这样的值,因此,multiset的这种同一个键多次出现的机制还是有其独立存在的价值的。
相关文章推荐
- Effective STL 条款21: 关联容器的strict weak order(让比较函数对相等的值返回false)
- Effective STL - 为指针的关联容器指定比较函数
- Effective STL 条款21: 关联容器的strict weak order(让比较函数对相等的值返回false) .
- Effective STL 条款21: 关联容器的strict weak order(让比较函数对相等的值返回false)
- Effective STL 条款21: 关联容器的strict weak order(让比较函数对相等的值返回false)
- 关联容器:永远让比较函数对相等的值返回false
- Effective STL 条款21: 关联容器的strict weak order(让比较函数对相等的值返回false)
- 关联容器存放的是指针时,自定义比较函数模板
- 第十一章 顺序容器和关联容器的比较
- 顺序容器和关联容器的比较
- 关于函数传参,全局变量,局部变量的一点认识
- 给数组对象sort函数传递比较函数参数的一点反思
- C语言学习过程中对于strcat函数使用的一点认识
- 函数调用和尾递归的一点认识
- 为容器添加比较函数,自定义容器的排序规则代码示例
- 对C++中关联容器一些基础知识的认识
- 对于HOOK函数的一点认识
- C++ 容器自定义比较函数
- STL 笔记(二) 关联容器 map、set、multimap 和 multimap常用函数
- 20170608_STL 中vector 容器的一些常用函数,vector和数组的比较