tuple(元组)
元组(tuple)是一个固定大小的不同类型值的集合,是泛化的std::pair,可以用于函数有多个返回值的时候,和pair不同的是,pair只有两个元素,而tuple可以有多个元素(不限于两个)
std::tuple中的元素创建的区域是跟std::tuple创建的区域相同。如果std::tuple是在栈上创建的,则其中的元素也是在栈中创建的;如果std::tuple是在堆中创建的,则其中的元素也在堆中创建。
一、构造tuple
//1.直接定义一个tuple
std::tuple<int, std::string, int> mytuple1{ 1,"abc",2 };
//2.使用make_tuple构造tuple
std::tuple<int, float, std::string> mytuple2;
mytuple2 = std::make_tuple(10, 2.6, "abc");
//3.自动识别tuple元素类型
auto mytuple3 = std::make_tuple(arr, 1, "abc");
auto mytuple4 = std::make_tuple(124,myarray, "abc");
//4.拼接tuple,可以将多个tuple连接到一起
auto mytuple5 = std::tuple_cat(mytuple1, mytuple2, mytuple4);
二、获取元素个数
//获取元素个数 size = 9,decltype(mytuple5)返回的是mytuple5的类型
size_t size = std::tuple_size<decltype(mytuple5)>::value;
三、获取元素类型
//获取tuple元素的类型,tuple_element的第一个参数指定要获取tuple第几个值的类型
std::tuple_element<0, decltype(mytuple5)>::type mytype;
auto t = typeid(mytype).name(); //t的值为int
四、获取元素的值
//解包,即获取tuple元素的值
std::tie(myInt, std::ignore, myString) = mytuple1;
//使用std::get<>获取元素的值
auto r1 = std::get<0>(mytuple3);//获取第1个元素,(从0开始)
auto r2 = typeid(r1).name(); //r2的值为int*
auto r3 = std::get<7>(mytuple5);//r3是一个array,包含三个元素
auto r4 = typeid(r3).name(); //r4的值为std::array
std::ignore用来占位,即不获取该位置元素的值
五、给tuple赋值
//给tuple的某个元素重新赋值,覆盖掉之前的值
std::get<0>(mytuple5) = 9;
六、其他
1. std::apply
简单理解就是,将tuple的元素应用于某个函数对象。(将tuple的元素作为实参调用某个函数)
2.std::make_from_tuple
以一个实参元组构造对象,就是不用将tuple的每一个元素取出来再去作为实参构造对象。(和初始化列表{}有一点相似)
示例代码:
#include <iostream> // std::cout
#include <tuple> // std::tuple, std::make_tuple, std::tie
#include <string>
#include <array>
int main()
{
int myInt;
std::string myString;
int arr[] = { 1,2,3 };
std::array<int, 3> myarray{ 7,8,9 };
//1.直接定义一个tuple
std::tuple<int, std::string, int> mytuple1{ 1,"abc",2 };
//2.使用make_tuple构造tuple
std::tuple<int, float, std::string> mytuple2;
mytuple2 = std::make_tuple(10, 2.6, "abc");
//3.自动识别tuple元素类型
auto mytuple3 = std::make_tuple(arr, 1, "abc");
auto mytuple4 = std::make_tuple(124,myarray, "abc");
//4.拼接tuple,可以将多个tuple连接到一起
auto mytuple5 = std::tuple_cat(mytuple1, mytuple2, mytuple4);
//获取元素个数 size = 9,decltype(mytuple5)返回的是mytuple5的类型
size_t size = std::tuple_size<decltype(mytuple5)>::value;
//获取tuple元素的类型,tuple_element的第一个参数指定要获取tuple第几个值的类型
std::tuple_element<0, decltype(mytuple5)>::type mytype;
auto t = typeid(mytype).name(); //t的值为int
//给tuple的某个元素重新赋值,覆盖掉之前的值
std::get<0>(mytuple5) = 9;
//解包,即获取tuple元素的值,myInt和myString的值为tuple元素对应位置的值
std::tie(myInt, std::ignore, myString) = mytuple1;
//使用std::get<>获取元素的值
auto r1 = std::get<0>(mytuple3);//获取第1个元素,(从0开始)
auto r2 = typeid(r1).name(); //r2的值为int*
auto r3 = std::get<7>(mytuple5);//r3是一个array,包含三个元素
auto r4 = typeid(r3).name(); //r4的值为std::array
system("pause");
return 0;
}