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;

 

 

 

posted @ 2020-05-10 22:09  啸傲风月  阅读(411)  评论(0编辑  收藏  举报