赞
踩
本文为《C++ Primer》的读书笔记
#include <tuple>
tuple
是类似pair
的模板。不同tuple
类型的成员类型可以不相同,tuple
可以有任意数量的成员
每个确定的
tuple
类型的成员数目是固定的
tuple
注意:第二个为每个成员提供初始值的初始化方式,由于对应的构造函数是
explicit
的,因此只能使用直接初始化语法
tuple
的成员要访问一个tuple
的成员,就要使用一个名为get
的标准库函数模板。为了使用get
, 我们必须指定一个显式模板实参(必须是一个整型常量表达式), 它指出我们想要访问第几个成员。我们传递给get
一个tuple
对象,它返回指定成员的引用:
auto book = get<0>(item); //返回item的第一个成员
tuple
成员的数量和类型如果不知道一个tuple
准确的类型细节信息,可以用两个辅助类模板来查询tuple
成员的数量和类型
auto item = make_tuple("0-999-78345-X", 3, 20. 00);
typedef decltype(item) trans; // trans 是item的类型
// 返回trans类型对象中成员的数量
size_t sz = tuple_size<trans>::value; //返回3
// cnt的类型与item中第二个成员相同
tuple_element<1, trans>::type cnt = get<1>(item); // cnt是一个int
只有两个tuple
具有相同数量的成员时, 我们才可以比较它们
由于
tuple
定义了<
和==
运算符, 我们可以将tuple
序列传递给算法, 并且可以在无序容器中将tuple
作为关键宇类型
tuple
返回多个值tuple
的一个常见用途是从一个函数返回多个值。例如,我们的书店可能是多家连锁书店中的一家。每家书店都有一个销售记录文件,保存每本书近期的销售数据。我们可能希望在所有书店中查询某本书的销售情况
假定每家书店都有一个销售记录文件。每个文件都将每本书的所有销售记录存放在一起。进一步假定已有一个函数可以读取这些销售记录文件, 为每个书店创建一个vector<Sales_data>
, 并将这些vector
保存在vector
的vector
中:
// files中的每个元素保存一家书店的销售记录
vector<vector<Sales_data>> files;
我们将编写一个函数, 对于一本给定的书, 在files
中搜索出售过这本书的书店。对每家有匹配销售记录的书店,我们将创建一个tuple
来保存这家书店的索引和两个迭代器。索引指出了书店在files
中的位置, 而两个迭代器则标记了给定书籍在此书店的vector<Sales_ data>
中第一条销售记录和最后一条销售记录之后的位置
我们首先编写查找给定书籍的函数:
// matches 有三个成员: 一家书店的索引和两个指向书店vector 中元素的迭代器 typedef tuple<vector<Sales_data>::size_type, vector<Sales_data>::const_iterator, vector<Sales_data>::const_iterator> matches; // files 保存每家书店的销售记录,book 表示要查找的书籍的ISBN号 // findBook 返回一个vector, 每家销售了给定书籍的书店在其中都有一项 vector<matches> findBook(const vector<vector<Sales_data>> &files, const string &book) { vector<matches> ret; // 对每家书店, 查找与给定书籍匹配的记录范围(如果存在的话) for (auto it = files.cbegin(); it != files.cend(); ++it) { // 查找具有相同ISBN 的Sales_data 范围 auto found = equal_range(it->cbegin(), it->cend(), book, compareisbn); if (found.first != found.second) // 此书店销售了给定书籍 // 记住此书店的索引及匹配的范围 ret.push_back(make_tuple(it - files.cbegin(), found.first, found.second)); } return ret; // 如果未找到匹配记录的话, ret 为空 }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。