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;
    }
    
  • 相关阅读:
    常见S1信令交互流程
    pthread_cond_wait避免线程空转
    sqlite:多线程操作数据库“database is locked”解决方法(二)
    sqlite:多线程操作数据库“database is locked”解决方法
    大端 小端
    关于天气分类的贝叶斯预测
    n 支队伍比赛,分别编号为 0,1,2。。。。n-1,已知它们之间的实力对比关系, 存储在一个二维数组 w[n][n]中,w[i][j] 的值代表编号为 i,j 的队伍中更强的一支。
    AC自动机 多模式匹配
    浮点数转换成二进制
    在一个缓冲去内实现三个栈,使用自有链表记录空闲块
  • 原文地址:https://www.cnblogs.com/mmmmmmmmm/p/14035956.html
Copyright © 2011-2022 走看看