tuple是快速随意的结构体

一、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);

四、判断

和容器类似有:== =! >= > <= <

©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页