zoukankan      html  css  js  c++  java
  • C++11 STL Pair和Tuple

    1.Pair

    1.1 Pair定义:

    namespace std {
      template<class _T1, class _T2>
        struct pair
        {
          _T1 first;
          _T2 second;
        }
    }

    两个成员都是public。

    实现一个泛型类函数模板,将一个pair写入一个stream内:

    #include <iostream>
    using namespace std;
    template <typename T1,typename T2>
    ostream& operator<< (ostream& strm,const pair<T1,T2>& p){
                        return strm<<"["<<p.first<<","<<p.second<<"]";
    }

    C++11起,可以对pair使用类似Tuple的操作。

    typedef pair<int,float> IntFloatPair;
    IntFloatPair p(
    10,20.3); cout<<p<<endl; cout<<get<0>(p)<<endl; cout<<get<1>(p)<<endl; cout<<tuple_size<IntFloatPair>::value<<endl; tuple_element<0,IntFloatPair>::type tmp=12.3; cout<<tmp<<endl;

     当时用tuple作为参数传递给first或/和second时,需要将std::piecewise_construct作为额外的第一个参数。

    class Foo{
    public:
        Foo(tuple<int,float> t){
            cout<<"Foo::Foo(tuple)"<<endl;
        }
        template<typename... Args>
        Foo(Args... args){
            cout<<"Foo::Foo(args...)"<<endl;
        }
    };
    
    int main()
    {
        tuple<int,float> t(1,2.22);
        pair<int,Foo> p1(42,t);
        pair<int,Foo> p2(piecewise_construct,make_tuple(42),t);
    }

     便捷函数make_pair()

    pair<int,string> mp=make_pair(10,"aaa");

    2.Tuple

    tuple可以拥有任意数量的元素。

    #include <tuple>
    #include <string>
    #include <complex>

    using namespace std; int main(){ tuple<string,int,int,complex<double>> t_tmp; tuple<int,float,string> t_tmp1(41,6.3,"nico"); cout<<get<0>(t_tmp1)<<" "; cout<<get<1>(t_tmp1)<<" "; cout<<get<2>(t_tmp1)<<endl; auto t_tmp2=make_tuple(22,44,"nico"); get<1>(t_tmp1)=get<1>(t_tmp2); if(t_tmp1<t_tmp2){ t_tmp1=t_tmp2; } }

    make_tuple() 和 tie()

    tie()是建立一个由引用构成的tuple。

    tuple<int,float,string> t1(77,1.1,"more light");
    int i;
    float f;
    string s;
    cout<<"i="<<i<<" f="<<f<<" s="<<s<<endl;
    make_tuple(ref(i),ref(f),ref(s))=t1;
    cout<<"t1: ";
    cout<<get<0>(t1)<<" ";
    cout<<get<1>(t1)<<" ";
    cout<<get<2>(t1)<<" "<<endl;
    cout<<"i="<<i<<" f="<<f<<" s="<<s<<endl;
    
    int i2;
    float f2;
    string s2;
    cout<<"i2="<<i2<<" f2="<<f2<<" s2="<<s2<<endl;
    tie(i2,f2,s2)=t1;
    cout<<"i2="<<i2<<" f2="<<f2<<" s2="<<s2<<endl;

    tuple_size:可获取元素个数

    tuple_element<idx,tupletype>::type:可获取第idx个元素的类型

    tuple_cat:可以将多个tuple串成一个tuple

    tuple<int,float,string> t2(1,3.2,"aaa");
    cout<<"t2 size="<<tuple_size<decltype(t2)>::value<<endl;
    tuple_element<0,decltype(t2)>::type first=1;
    cout<<"t2's first element="<<first<<endl;
    auto t3=tuple_cat(t1,t2);
    cout<<"t3: ";
    cout<<get<0>(t3)<<" ";
    cout<<get<1>(t3)<<" ";
    cout<<get<2>(t3)<<" ";
    cout<<get<3>(t3)<<" ";
    cout<<get<4>(t3)<<" ";
    cout<<get<5>(t3)<<" "<<endl;

     tuple的输入输出

    #include "printtuple.hpp"
    #include <iostream>
    #include <tuple>
    #include <string>
    
    int main()
    {
        tuple<int,float,string> tt(77,1.1,"more light");
        cout<<"io: "<<tt<<endl;
    }

     tuple和pair的转化

    tuple<int,float> t4=make_pair(1,2.1);
    cout<<"t4: "<<t4<<endl;

     

  • 相关阅读:
    Android—应用程序开机自启
    Android—简单的仿QQ聊天界面
    Android—关于自定义对话框的工具类
    Android—基于GifView显示gif动态图片
    Android—ListView条目背景为图片时,条目间距问题解决
    Android—自定义开关按钮实现
    FileProvider的使用
    Android 7.0新特性
    Android SDK自带调试优化工具
    Android监视器概述
  • 原文地址:https://www.cnblogs.com/xiaoaofengyue/p/12865409.html
Copyright © 2011-2022 走看看