tuple(元组)

元组(tuple)是一个固定大小的不同类型值的集合,是泛化的std::pair,可以用于函数有多个返回值的时候,和pair不同的是,pair只有两个元素,而tuple可以有多个元素(不限于两个)

中文标准库:tuple

用std::enable_if实现tuple的get函数

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

typeid和decltype用法

四、获取元素的值

    //解包,即获取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的元素作为实参调用某个函数)

std::index_sequence

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;
}
posted @ 2020-11-25 14:34  滴哒哒哒  阅读(164)  评论(0编辑  收藏  举报