C++通用工具:pair和tuple

pair

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

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

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

由上述定义,咱们不可贵出,pair的全部成员都是public的,因此pair提供了直接访问数据成员的能力。优化

pair操做函数spa

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在进行比较操做时,第一元素具备较高比较级,只有在第一元素相等时,才会去比较第二元素。code

tuple

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

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

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

tuple的操做get

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

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的读入输出it

#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不可在编译期进行赋值。

相关文章
相关标签/搜索