元组,类似pair,但成员不止两个,可以是任意数量。
满足需求:当需要把一组数据组合成单一对象,又不想麻烦的定义个数据结构。
可以把tuple看成一个快速而随意的数据结构。

支持的操作

  1. #include <tuple>
  2. tuple<T1,T2,...,Tn> t; // t是一个tuple,成员数为n,第i个成员的类型为Ti,
  3. // 所有成员都进行值初始化
  4. tuple<T1,T2,...,Tn> t(v1,v2,...,vn); // t是一个tuple,成员类型为T1...Tn,
  5. // 此构造函数是explicit的
  6. // 返回一个用给定初始值初始化的tuple。tuple的类型从初始值的类型推断
  7. make_tuple(v1, v2, ..., vn);
  8. t1 == t2; // 当且仅当两个tuple具有相同数量的成员且成员对应相等时,为true。
  9. t1 != t2; // 等价于!(t1 == t2)
  10. // relop: 关系运算符,大于小于。
  11. t1 relop t2; // tuple的关系运算使用字典序,两个tuple必须具有相同数量的成员。
  12. // 使用 < 运算符比较每个对应成员
  13. get<i>(t); // 返回t的第i个数据成员的引用,从0开始,tuple的所有成员都是public的
  14. // 如果t是一个左值,结果是一个左值引用,否则,结果是一个右值引用。
  15. // 表示tupleType中成员的数量,类型为size_t
  16. // 一个类模板,可以通过一个tuple类型来初始化。
  17. // 它有一个名为value的public_constexpr_static数据成员
  18. tuple_size<tupleType>::value;
  19. // 表示tupleType中指定成员的类型
  20. // 一个类模板,可以通过一个整型常量和一个tuple类型来初始化。
  21. // 它有一个名为type的public成员,
  22. tuple_element<i, tupleType>::type;
  1. tuple<size_t, size_t, size_t> threeD = {1, 2, 3}; // 错误,构造函数explicit的
  2. tuple<size_t, size_t, size_t> threeD; // 三个成员都设置为0
  3. tuple<string, vector<double>, int, list<int>> // 成员类型几乎没有限制
  4. someVal("constants", {3.14 , 2.718}, 42, {0, 1, 2, 3, 4, 5));
  5. // 自动推断类型为:tuple<const char*, int, double> 。
  6. auto item = make_tuple("0-999-78345-X", 3 , 20.00);
  7. auto book = get<0>(item); // 返回item的第一个成员
  8. auto cnt = get<1>(item); // 返回item的第二个成员
  9. auto price = get<2>(item) / cnt; // 返回item的最后一个成员
  10. get<2>(item) *= 0.8;
  11. typedef decltype(item) trans; // trans是item的类型
  12. size_t sz = tuple_size<trans>::value; //返回3
  13. // cnt类型与item中第二个成员相同
  14. tuple_element<1, trans>::type cnt = get<1>(item); //cnt是一个int

tuple可以实现函数多返回值的效果。