zoukankan      html  css  js  c++  java
  • tuple(元组)

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

    中文标准库:tuple

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

    一、构造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的元素作为实参调用某个函数)

    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;
    }
    
  • 相关阅读:
    poj 1789 每个字符串不同的字母数代表两个结点间的权值 (MST)
    poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题
    poj 1631 最多能有多少条不交叉的线 最大非降子序列 (LIS)
    hdu 5256 最少修改多少个数 能使原数列严格递增 (LIS)
    hdu 1025 上面n个点与下面n个点对应连线 求最多能连有多少条不相交的线 (LIS)
    Gym 100512F Funny Game (博弈+数论)
    UVa 12714 Two Points Revisited (水题,计算几何)
    UVa 12717 Fiasco (BFS模拟)
    UVa 12718 Dromicpalin Substrings (暴力)
    UVa 12716 && UVaLive 6657 GCD XOR (数论)
  • 原文地址:https://www.cnblogs.com/mmmmmmmmm/p/14035956.html
Copyright © 2011-2022 走看看