元组,类似pair,但成员不止两个,可以是任意数量。
满足需求:当需要把一组数据组合成单一对象,又不想麻烦的定义个数据结构。
可以把tuple看成一个快速而随意的数据结构。
支持的操作
#include <tuple>
tuple<T1,T2,...,Tn> t; // t是一个tuple,成员数为n,第i个成员的类型为Ti,
// 所有成员都进行值初始化
tuple<T1,T2,...,Tn> t(v1,v2,...,vn); // t是一个tuple,成员类型为T1...Tn,
// 此构造函数是explicit的
// 返回一个用给定初始值初始化的tuple。tuple的类型从初始值的类型推断
make_tuple(v1, v2, ..., vn);
t1 == t2; // 当且仅当两个tuple具有相同数量的成员且成员对应相等时,为true。
t1 != t2; // 等价于!(t1 == t2)
// relop: 关系运算符,大于小于。
t1 relop t2; // tuple的关系运算使用字典序,两个tuple必须具有相同数量的成员。
// 使用 < 运算符比较每个对应成员
get<i>(t); // 返回t的第i个数据成员的引用,从0开始,tuple的所有成员都是public的
// 如果t是一个左值,结果是一个左值引用,否则,结果是一个右值引用。
// 表示tupleType中成员的数量,类型为size_t
// 一个类模板,可以通过一个tuple类型来初始化。
// 它有一个名为value的public_constexpr_static数据成员
tuple_size<tupleType>::value;
// 表示tupleType中指定成员的类型
// 一个类模板,可以通过一个整型常量和一个tuple类型来初始化。
// 它有一个名为type的public成员,
tuple_element<i, tupleType>::type;
tuple<size_t, size_t, size_t> threeD = {1, 2, 3}; // 错误,构造函数explicit的
tuple<size_t, size_t, size_t> threeD; // 三个成员都设置为0
tuple<string, vector<double>, int, list<int>> // 成员类型几乎没有限制
someVal("constants", {3.14 , 2.718}, 42, {0, 1, 2, 3, 4, 5));
// 自动推断类型为:tuple<const char*, int, double> 。
auto item = make_tuple("0-999-78345-X", 3 , 20.00);
auto book = get<0>(item); // 返回item的第一个成员
auto cnt = get<1>(item); // 返回item的第二个成员
auto price = get<2>(item) / cnt; // 返回item的最后一个成员
get<2>(item) *= 0.8;
typedef decltype(item) trans; // trans是item的类型
size_t sz = tuple_size<trans>::value; //返回3
// cnt类型与item中第二个成员相同
tuple_element<1, trans>::type cnt = get<1>(item); //cnt是一个int
tuple可以实现函数多返回值的效果。