元组,类似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; // 三个成员都设置为0tuple<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可以实现函数多返回值的效果。
