一、tuple等价于结构体
假设我们希望存储学号int
、姓名string
和城市string
的一组数据,这组数据不能使用一个vector
来存储,因为vector
只能存储同类数据。最简单的方法就是定义一个结构体:
struct info
{
int ID,
string name,
string city
};
Zhangsaninfo={1,"zhangsan","nanjing"};
Lisiinfo={2,"Lisi","Guangzhou"};
在新标准下,tuple
模板也能完成这个任务:
tuple<int, string, string> Zhangsaninfo(1,"zhangsan","nanjing");
tuple<int, string, string> Lisi(1,"Lisi","Guangzhou");
如果说vector是同类数据的集合,那么tuple就是可以不同类的集合。回想一下,我们不能返回多个函数值,但是可以返回一个结构体来完成相同的操作,有了tuple
模板,更是简洁的完成了这一任务。
二、tuple的初始化
使用之前需要增加头文件支持#include<tuple>
,tuple初始化没有顺序容器这么多形式,要么默认初始化,要么每个成员都指定值。
tuple<T1,T2,...,Tn> t1;//形式1:默认初始化、
tuple<T1,T2,...,T3> t2(v1,v2,...,vn);//形式2:指定值初始化
tuple<T1,T2,...,T3> t3(t2);//形式3:拷贝构造
可以借助make_tuple(v1,v2,...,vn)
完成tuple的拷贝初始化。
tuple<T1,T2,...,T3> t1=make_tuple(v1,v2,...,vn);
tuple<T1,T2,...,T3> t2={v1,v2,...,vn};//error,等号形式拷贝构造,为了完成拷贝构造将会尝试调用形式2完成拷贝构造过程,但是形式2进行了explicit声明,所以调用失败
tuple<T1,T2,...,T3> t3{v1,v2,...,vn};//ok,调用指定值初始化构造函数
三、tuple访问
get<i>(tup);//访问tup中的第i个元素的引用,引用是左右属性取决于tup是左值还是右值
四、tuple成员数量和类型获取
因为tuple没有size成员,所以我们需要通过辅助的类模板来获取tuple成员数量:
tuple_size<tupleType>::value
如:
tuple<int, string, double> info(1, "apple", 2.0);
tuple_size<tuple<int, string, double>>::value;
每一个成员的类型也可以通过:
tuple_element<i,tupleType>::type
如:
tuple_size<1,tuple<int, string, double>>::type;
利用新声明可以简化:
typedef decltype<item> trans;
size_t sz=tuple_size<trans>::value;
tuple_element<1,trans> cnt=get<1>(item);
四、判断
和容器类似有:== =! >= > <= <