您的位置:首页 > 其它

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

2012-12-31 13:38 204 查看
这次学习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的这种同一个键多次出现的机制还是有其独立存在的价值的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: