关联容器的比较函数的一点认识

这次学习C++ PRIMER中文第四版已经到第15章“面向对象编程”了。在15.8.3节,讲到使用带比较器的关联容器时,书本使用multiset容器来保存键,但是这里却用了2个:std::multiset。其中Sales_item是一个类,而Comp是一个比较函数的类型别名,该函数具体定义如下:

//具体的比较函数

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的这种同一个键多次出现的机制还是有其独立存在的价值的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值