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;
    }
    
  • 相关阅读:
    解决 搭建Jekins过程中 启动Tomcat的java.net.UnknownHostException异常
    射手和农场主
    java 和 JS(javaScript)中的反斜杠正则转义
    分享修改密码的SharePoint Web part: ITaCS Change Password web part
    分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机
    Office 365 的公共网站的一些限制及解决的办法
    SharePoint 2013 关闭 customErrors
    安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误
    安装Office Web Apps Server 2013 – KB2592525安装失败
    如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)
  • 原文地址:https://www.cnblogs.com/mmmmmmmmm/p/14035956.html
Copyright © 2011-2022 走看看