zoukankan      html  css  js  c++  java
  • C++通用工具:pair和tuple

    pair

    class pair可将两个value视为一个单元。C++标准库内多处都用到了这个class,比如容器map,multimap,unordered_map等,任何函数如果需要返回两个value,也需要用到pair,比如minmax()等。

    class pair的完整功能定义于头文件

    #include<utility>
    namespace std
    {
        template <typename T1,typename T2>
        struct pair
        {
            T1 first;
            T2 second;
            ...
        };
    }

    由上述定义,我们不难得出,pair的所有成员都是public的,所以pair提供了直接访问数据成员的能力。

    pair操作函数

    pair<t1,t2> p                                 //default构造函数,建立一个函数,其元素类型分别t1和t2,各自以default函数初始化
    pair<t1,t2> p(val1,val2)                      //建立一个pair,元素类型分别为t1和t2,以val1和val2为初值
    pair<t1,t2> p(piecewise_construct,val1,val2); //建立一个pair,元素类型分别为tuple t1和t2,以tuple val1和val2为初值
    pair<t1,t2> p(p2)                             //copy构造函数,建立p成为p2的拷贝
    p=p2                                          //将p2的值赋给p
    p.first                                       //获得pair内的第一value
    p.second                                      //获得pair内的第二value
    get<0>(p)                                     //等价于p.first
    get<1>(p)                                     //等价于p.second
    p1.swap(p2)                                   //互换p1和p2的数据
    make_pair<val1,val2>                          //返回一个pair,带有val1和val2的类型和数值。

    注意,pair在进行比较操作时,第一元素具有较高比较级,只有在第一元素相等时,才会去比较第二元素。

    tuple

    tuple又叫元组,它扩展了pair的概念,拥有任意数量的元素。tuple呈现出一个异质元素列,其中每个类型都可以用来被指定。

    tuple最初沿用的是C++98的标准,默认建议是至少10个实参,又累赘又限制,后来到C++11,tuple得到了极大的优化,才有了现在的class tuple

    #include<tuple>
    namespace std
    {
        template <typename... Types>
        class tuple;
    }

    tuple的操作

    原则上,tuple的接口十分直观

    tuple<t1,t2,...,tn> t               //以n个给定类型的元素建立一个tuple,以各元素类型得到default构造函数完成初始化,基础类型的初值为0
    tuple<t1,t2,...,tn> t(v1,v2,...,vn) //以n个给定类型的元素建立一个tuple,以给定值完成初始化
    t=t2                                //将t2赋值给t
    t.swap(t2)                          //互换t1和t2的数据
    make_tuple(v1,v2,...)               //以传入的所有数据和类型建立一个tuple,并允许由此tuple提取数值

    tuple的读入输出

    #include<iostream>
    #include<tuple>
    #include<string>
    using namespace std;
    int main()
    {
        tuple<string,string,string,int> t;
        get<0>(t)="Hello";
        get<1>(t)="World";
        get<2>(t)=" !";
        get<3>(t)=2019;
        cout<<get<0>(t)<<" "<<get<1>(t)<<get<2>(t)<<" "<<get<3>(t);
        return 0;
    }

    get<num>(typename tuple)里,num对应元素编号,以0开始,()内是tuple的名称,注意,tuple不可在编译期进行赋值。

  • 相关阅读:
    POJ 3660 Cow Contest (floyd求联通关系)
    POJ 3660 Cow Contest (最短路dijkstra)
    POJ 1860 Currency Exchange (bellman-ford判负环)
    POJ 3268 Silver Cow Party (最短路dijkstra)
    POJ 1679 The Unique MST (最小生成树)
    POJ 3026 Borg Maze (最小生成树)
    HDU 4891 The Great Pan (模拟)
    HDU 4950 Monster (水题)
    URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
    URAL 2037 Richness of binary words (回文子串,找规律)
  • 原文地址:https://www.cnblogs.com/cloudplankroader/p/10460396.html
Copyright © 2011-2022 走看看