菜缤的世界 CairBin's Blog - 元组
type: channel
link: https://blog.cairbin.top/index.php/tag/元组/
items: C++元组(tuple)模板类型

C++元组(tuple)模板类型
type: item
date: 2022-06-12T14:23:00+00:00
description: C++元组tuple类型介绍元组tuple是C++的一个模板，不同tuple类型的成员类型也不相同，但是一个tuple可以有任意数量的成员。每个tuple类型的成员个数是一定的，但是不同的tuple成员个数可以不同。tuple的定义及初始化使用tuple要引入tuple头文件#include <tuple>tuple定义以及初始化（我们这里以成员类型为int、string、vector<int>为例子）tuple<int,string,vector<int>> test{1,"hello,world",{4,5,6}};当然也可以使用它的构造函数进行初始化tuple<int, string,vector<int>> test(1,"hello,world",{4,5,6});存在这种情况，表面上看起来没有进行任何初始化操作，但实际上利用了不带参数的默认构造函数tuple<size_t, size_t> test; //每个成员的值为0当然如果你这样定义后，又想对test的初始值所作更改，可以这样写，如下所示。（实际上现在的test不是原来的test，它被你新创建的tuple对象所替代了，严格意义来讲并不算是初始化）tuple<size_t, size_t> test; //每个成员的值为0 test = tuple<size_t, size_t>(1,2); //第一个成员的值为1，第二个成员的值为2另外标准库定义了make_tuple函数来生成tuple对象，我们可以用auto关键字来推测生成的tuple的类型auto test2 = make_tuple(3.14,"wasd");如果要添加一个vector作为成员，则情况如下//错误写法 auto test2 = make_tuple(3.14,"wasd",{ 3,4,5 }); //正确写法 vector<int> nums = { 3,4,5 }; auto test2 = make_tuple(3.14,"wasd",nums);tuple的使用成员访问说起tuple的使用，最能直接想到的自然是对tuple的访问了。在C++标准库里，有一个名为get的函数模板。为了使用get，我们必须指定一个显式模板实参来指示访问的第几个成员，并在函数参数中给予它一个tuple对象。tuple<int, string, vector<int>> test{ 1,"hello,world",{4,5,6} }; cout << get<0>(test) << endl; //打印test第一个成员，其类型为int cout << get<1>(test) << endl; //打印test第二个成员，其类型为string cout << get<2>(test)[0] << endl; //打印test第三个成员vector<int>的第一个元素下面是返回结果1 hello,world 4 获取tuple信息可用以下方法获取tuple元素个数tuple<int, double, vector<string>> test{ 1,1.23,{"123","456"}}; //获取tuple成员个数 size_t num = tuple_size<decltype(test)>::value; //利用tuple某个成员类型来声明变量（以第0个成员为例） tuple_element<0, decltype(test)>::type n = get<0>(test);拼接tupletuple<int, int, int> test(1,2,3); tuple<int, int, int> test2(4,5,6); tuple<int, int, int> test3(7,8,9); //拼接 auto new_tup = tuple_cat(test, test2, test3);交换tupletuple<int, int, int> test(1,2,3); tuple<int, int, int> test2(4,5,6); //交换 test.swap(test2);tuple解包tuple使用tie方法进行解包，tie的参数个数与tuple成员个数一致，否则要用ignore占位tuple<int,int> test{2,8}; tuple<int,int,int> test2{2,8,6}; int a, b; //解包 tie(a, b) = test; //ignore占位的情况 tie(a, b, ignore) = test2;tuple比较当两个tuple具有相同数目的成员，且对应成员类型可比较的时候，tuple比较才合法//有如下四个tuple tuple<strin…