C++ Primer第五版笔记——tuple类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rest_in_peace/article/details/82586377

tuple是类似pair的模板。每个pair的成员类型都不相同,但每个pair都有两个成员。tuple类型的成员类型也都不相同,但一个tuple可以有任意数量的元素。每个确定的tuple类型的成员数目是固定的,但是两个tuple类型的成员数目可以不同。
tuple可以用在将一些数据组合成单一对象,但又不想麻烦的定义一个新数据结构来表示这些数据时。可以将它看做是一个“快速而随意”的数据结构。
这里写图片描述

定义与初始化
当定义一个tuple时,需要指出每个成员的类型:

tuple<size_t,size_t,size_t> threeD;         //默认初始化为0
tuple<string,vector<double>,int,list<int>>
    somevalue("lalal",{3.14,2.2},42,{0,1,2,3});

tuple的构造函数是explicit的(不能隐式调用构造函数),因而必须使用直接初始化语法:

tuple<size_t,size_t,size_t> threeD = {1,2,3};   //错误
tuple<size_t,size_t,size_t> threeD{1,2,3};      //正确

类似make_pair函数,标准库提供了make_tuple函数,也可以生成tuple对象:

auto item = make_tuple("lbj",34,2.03);

类似make_pair,make_tuple函数使用初始值的类型来推断tuple的类型。

访问tuple的成员
一个pair总有两个成员,所以可以命名为first和second,但是这种方式不舍和tuple,因为tuple的成员数量没有限制,因此tuple的成员没有命名。要访问那一个tuple的成员,需要使用一个名为get的标准库函数模板。其模板实参表示希望访问第几个成员,从0开始计数

auto name = get<0>(item);           //返回item的第一个成员

如果不知道一个tuple中确定的类型细节信息,可以使用两个辅助类模板来查询tuple成员的数量和类型:

typedef decltype(item) trans;       //trans得到tuple的类型
size_t sz = tuple_size(trans)::value;   //得到成员数量
tuple_element<1,trans>::type age = get<1>(item);    //age是一个int类型 

为使用tuple_size和tuple_element,需要知道tuple的类型,而获得类型的方法可以使用decltype。

关系和相等运算符
tuple的关系和相等运算符的行为类似容器的对应操作,这些运算符逐对比较左侧和右侧的成员,只有两个tuple具有相同数量的成员时才可以做比较,且为了使用相等和不等运算符,对每对成员使用==都必须是合法的;为使用关系运算符,对每对成员使用<必须都是合法的。


猜你喜欢

转载自blog.csdn.net/rest_in_peace/article/details/82586377