9.1.6  对组(Pairs)

9.1.6 对组(Pairs)

1.对组的概念

通俗地讲,对组(Pair)适用于需要将两个数视为一个单元数值的场合。C++标准程序库内多处使用该类。尤其是map和multimap型容器,它们均是使用对组实现管理其“键值和实值”这两个成对出现的元素。任何函数若总是需要返回两个数值,也可以使用对组。在头文件<utility>中,对组的声明形式如下:

978-7-111-51399-5-Chapter09-19.jpg

为便于使用pair类型,程序员可以构造明确的模板类pair<T,U>对象,可以通过让默认的构造函数提供默认初始值来完成该工作。如果需要获取pair对象(例x)的第一个成员,可以使用first;如果需要获取第二个成员,需要使用second。使用成员模板构造函数,可以用另一个模板类pair<V,W>的对象构造模板类pair<T,U>的对象。使用成员模板构造函数,可以用另一个模板类pair<V,W>的对象来构造模板类pair<T,U>的对象。相应成员提供初始值。

对组被定义成结构体(struct),而不是定义成类(class)。其所有成员都是公用型(public),可以直接存取pair中的单一值。结构体中默认的构造函数会生成一个pair(),以两个“被该default构造函数分别初始化”的值作为初始值。根据语言规则,基本型别的默认构造函数可以适当的初始化。例如,

978-7-111-51399-5-Chapter09-20.jpg

在结构体pair的对象p初始化时,会调用类型int()和float()来初始化p。该两个构造函数均返回零值。如果pair对象被复制,调用的是由系统隐式生成的copy构造函数。之所以使用模版类的copy类型构造函数,是因为构造过程中可能需要隐式型别转换。

pair对象之间还可以实现比较。为比较两个pair对象,C++标准程序库提供常用的操作符。若两个pair对象内的所有元素均相等,则两个pair对象即视为相等。pair对象“==”运算符的声明形式如下:

978-7-111-51399-5-Chapter09-21.jpg

两个pair对象互相比较时,第一元素具有较高的优先级。如果两个pairs的第一元素不相等,其比较结果就成为比较行为的结果。若第一元素相等,才继续比较第二元素,并将比较结果作为整体比较结果。

978-7-111-51399-5-Chapter09-22.jpg

其他比较运算符和运算符“<”的声明方法是相同的。

2.便捷make_pair()函数

模板(template)make_pair()函数使程序员无需写出型别,即可生成一个pair对象。make_pair()函数的声明形式如下:

978-7-111-51399-5-Chapter09-23.jpg

使用make_pair()函数即可以迅速地创建一个pair对象,从而不一定非要使用pair结构创建该结构的对象,例如,

978-7-111-51399-5-Chapter09-24.jpg

尤其当必须接受pair型对象作为函数参数时,使用make_pair()尤为重要。例如,

//函数声明

978-7-111-51399-5-Chapter09-25.jpg

//函数定义

978-7-111-51399-5-Chapter09-26.jpg

由以上内容可知,make_pair()函数使得“将两个值作为一个pair参数来传递”,其形式更简单、更容易。即使两个值的型别不能准确地符合要求,也在template构造函数提供的支持下顺利工作。尤其使用map和multimap时,pair对象更是具有绝对的明确的型别。例如,

978-7-111-51399-5-Chapter09-27.jpg

上式产生的效果和下述代码是不一致的

978-7-111-51399-5-Chapter09-28.jpg

后者所产生的对组的,第二个元素的型别是double。使用重载函数或类模板template,更确切的型别非常重要。为提高效率,程序员可能会同时提供针对float和double的函数或类模板template。

诸如上述情况,确切的数据类型型别尤显重要。

3.对组简例

C++标准程序库大量运用对组结构对象。前面章节介绍的map型容器和multimap型容器的元素型别均是使用pair型别,即键值(key/value)。C++标准程序库中凡是“必须返回两个值”的函数,均可利用对组对象。下面给出最简单的例题,说明pair类型的使用方法。

注意:若map型容器的元素类型是对组,则使用map型容器排序有多种方法:①在map声明时,即定义排序规则;②将map中的元素转换至vector型容器中,使用算法sort排序。第一种方法是自动排序,数据输入之后,不再保留原有的输入顺序;第二种方法在数据输入完毕之后,能够保持原有的输入顺序。在此基础上进行排序看似更加合理一些。

例9-3

978-7-111-51399-5-Chapter09-29.jpg

978-7-111-51399-5-Chapter09-30.jpg

978-7-111-51399-5-Chapter09-31.jpg

978-7-111-51399-5-Chapter09-32.jpg

例9-3的执行结果为:

978-7-111-51399-5-Chapter09-33.jpg

提示

本节讲述了相等比较、小于比较、复制构造、默认构造、配置器要求、运算符和对组等7部分内容。前面的章节已经涉及了对组(pair)的内容,本章的第9.1.7节又详细讲解了对组的概念以及常用对组的使用方法。