C++11:Tuple元组

发布时间 2023-06-20 16:12:11作者: 言午丶

C++11引入了一种类模板tuple,实例化的对象可以存储任意数量、任意类型的数据

当存储多个不同类型的元素时,可以用tuple

当函数需要返回多个数据时,可以将这些数据存储在tuple中,返回tuple对象

 

Tuple

#include <tuple>

using std::tuple

 

1.默认构造函数

constexpr tuple();

2.拷贝构造函数

tuple(const tuple& tp1);

3.移动构造函数

tuple(tuple&& tp1);

4.隐式类型转换构造函数

template <class...UTypes>

  tuple(const tuple<UTypes...>& tp1);  //左值方式

template <class...UTypes>

  tuple(tuple<UTypes....>&& tp1);    //右值方式

5.支持初始化列表的构造函数

explicit tuple(const Types&...elems);    //左值方式

template<class...UTypes>

  explicit tuple(UTypes&&...elems);   //右值方式

6.将pair对象转换为tuple对象

template <class U1, class U2>

  tuple(const pair<U1, U2>& pr);    //左值方式

template <class U1, class U2>

  tuple(pair<U1, U2>&& pr);      //右值方式

 

#include <iostream>

#include <tuple>

using std::tuple;

 

int main()

{

  std::tuple<int, char> first;

  std::tuple<int, char> second(first);

  std::tuple<int, char> third(std::make_tuple(20, 'b'));

  std::tuple<long, char> fourth(third);

  std::tuple<int, char> fifth(10, 'a');

  std::tuple<int, char> sixth(std::make_pair(30, 'c'));

  

  auto first = std::make_tuple(10, 'a');

  const int a = 0; int b[3];

  auto second = std::make_tuple(a, b);

}

 

#include <iostream>

#include <tuple>

 

int main()

{

  int size;

  //创建一个tuple对象存储 10 和 'x'

  std::tuple<int, char> mytuple(10, 'x');

  //计算 mytuple 存储元素的个数

  size = std::tuple_size<decltype(mytuple)>::value;

  //输出 mytuple 中存储的元素

  std::cout << std::get<0>(mytuple) << " " << std::get<1>(mytuple) << std::endl;

  //修改指定的元素

  std::get<0>(mytuple) = 100;

  std::cout << std::get<0>(mytuple) << std::endl;

  //使用 make_tuple() 创建一个 tuple 对象

  auto bar = std::make_tuple("test", 3.1, 14);

  //拆解 bar 对象,分别赋值给 mystr、mydou、myint

  const char* mystr = nulllptr;

  double mydou;

  int myint;

  //使用 tie() 时,如果不想接收某个元素的值,实参可以用 std::ignore 代替

  std::tie(mystr, mydou, myint) = bar;

  std::tie(std::ignore, std::ignore, myint) = bar;  //只接收第3个整型值

  //将 mytuple 和 bar 中的元素整合到 1 个 tuple对象中

  auto mycat = std::tuple_cat(mytuple, bar);

  size = std::tuple_size<decltype(mycat)>::value;

  std::cout << size << std::endl;

}