第十七章:标准库特殊设施
- C++11极大扩充了标准库的规模和范围,标准库占据了C++11标准接近2/3的篇幅
tuple类型
tuple
是类似pair
的模板
:- pair和tuple的成员类型都可以不相同
- pair恰好有两个成员,tuple可有任意数量的成员
- 按照不同参数数量和类型实例化出的tuple是不同类型
- 若希望将一些数据组合成单一对象,可使用tuple。可将tuple看作一个“快速而随意”的数据结构
- tuple类型及其伴随类型和函数都在头文件tuple中
- tuple支持的操作见表17.1
定义和初始化tuple
- 定义一个tuple时,需要指出每个成员的类型。它们是模板参数,故必须在编译期确定
- 创建tuple对象时,可使用tuple的默认构造函数,它会对每个成员
值初始化
。也可为每个成员提供初始值。tuple的接受初始值的构造函数是explicit
的,即必须使用直接初始化而不能通过类型转换调用 - 可用
make_tuple
函数(类似make_pair
)生成tuple对象,它用实参的类型来推断tuple的类型 - 例子:tuple定义和初始化
|
|
- tuple类型的成员数目没有限制,故其成员都是匿名的,只可用
get
函数访问 get
是函数模板:- 接受一个显式模板实参指出要访问第几个成员,该实参是非类型参数,必须是整型的
constexpr
(模板参数必须在编译期确定) - 接受一个函数实参指出访问哪个tuple对象
- 返回指定成员的引用
- 接受一个显式模板实参指出要访问第几个成员,该实参是非类型参数,必须是整型的
- 若不知道一个tuple的准确类型,可以用两个辅助类模板来查询tuple成员的数量和类别:
tuple_size<tuple_type>::value
可查询tuple_type
有几个成员tuple_element<num,tuple_type>::type
可查询tuple_type
的第num
个成员的类型
- 例子:访问tuple的成员及其类型
|
|
- tuple的相等算符和关系算符类似容器:
- 只有两个tuple的成员数量相同才可比较
- 逐对比较成员,只有成员有
==
时才可比较tuple的==,只有成员有<
时才可比较tuple的<
- 由于tuple有==和<,故可将其传递给算法。另外,无序容器中可用tuple作为关键字类型
- 例子:tuple的相等和关系算符
|
|
使用tuple返回多个值
- tuple的常见用途是从一个函数返回多个值
- 例子:使用tuple从函数返回多个值
|
|