C++ Primer 5th笔记(chap 17 标准库特殊设施)tuple 类型

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 17 标准库特殊设施)tuple 类型相关的知识,希望对你有一定的参考价值。

1. 定义

将一些数据组合成单一对象(类似pair)

tuple支持的操作

操作解释
tuple<T1, T2, …, Tn> t;t是一个tuple,成员数为n,第i个成员的类型是Ti所有成员都进行值初始化。
tuple<T1, T2, …, Tn> t(v1, v2, …, vn);每个成员用对应的初始值vi进行初始化。此构造函数是explicit的。
make_tuple(v1, v2, …, vn)返回一个用给定初始值初始化的tuple。tuple的类型从初始值的类型推断。
t1 == t2当两个tuple具有相同数量的成员且成员对应相等时,两个tuple相等。
t1 relop t2tuple的关系运算使用字典序。两个tuple必须具有相同数量的成员。
get(t)返回t的第i个数据成员的引用:如果t是一个左值,结果是一个左值引用;否则,结果是一个右值引用。tuple的所有成员都是public的。
tuple_size::value一个类模板,可以通过一个tuple类型来初始化。它有一个名为value的public constexpr static数据成员,类型为size_t,表示给定tuple类型中成员的数量。
tuple_element<i, tupleType>::type一个类模板,可以通过一个整型常量和一个tuple类型来初始化。它有一个名为type的public成员,表示给定tuple类型中指定成员的类型。

1.1 定义和初始化tuple

定义和初始化示例:

tuple<size_t, size_t, size_t> threeD;/ / 三个成员都设置为 0
tuple<size_t, size_t, size_t> threeD{1,2,3};
tuple<size_t, size_t, size_t> threeD = {1,2,3};//error

tuple<string, vector<double>, int, list<int>>
someVal ( "constants", { 3.14 , 2.718 } , 42, { 0,1, 2, 3, 4, 5 } )

auto item = make_tuple("0-999-78345-X", 3, 2.00);
tem 是一个 tuple, 类型为 tuple<const char *, int, double>

1.2 访问tuple的成员

要访问tuple的成员,使用一个名为get的标准库函数模板,同时传递给get一个tuple对象,其返回指定成员的引用

auto book = get<0>(item);    //返回item的第一个成员
auto book = get<1>(item);    //返回item的第二个成员
auto book = get<2>(item)/cnt;    //返回item的最后一个成员
get<2>(item) *= 0.8;    //打折20%

1.3 decltype

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

typedef decltype (item) trans; / / trans 是 item的类型

1.4 tuple_size

tuple_size 有一个名为 value 的public static 数据成员, 它表示给定 tuple中成员的数量。

/ / 返回 trans 类型对象中成员的数量
size_t sz= tuple_size<trans>::value;//返回3

1.5 tuple_element

tuple_element 模板除了一个 tuple 类型外, 还接受一个索引值。 它有一个名为 type 的 public 类型成员, 表示给定 tuple 类型中指定成员的类型。

/ / cnt 的类型与 item 中第二个成员相同
tuple_element<1, trans>::type cnt = get<1> (item) ; // cnt 是一个 int

1.6 关系和相等运算符

只有两个 tuple 具有相同数量的成员时,才可以比较

tuple<string, string>  duo ( "1", "2" } ;
tuple<size_t, size_t> twoD (1, 2 ) ;
bool b (duo == twoD) ; / / 错误: 不能比较 size_t 和 string
tuple<size_t, size_t, size_t> threeD(1, 2, 3);
b = ( twoD < threeD) ; //错误: 成员数量不同
tuple<size_t, size_t> origin (0, 0);
b = (origin < twoD); //正确:b为true

以上是关于C++ Primer 5th笔记(chap 17 标准库特殊设施)tuple 类型的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 5th笔记(chap 17 标准库特殊设施)输出补白

C++ Primer 5th笔记(chap 17 标准库特殊设施)bitset类型

C++ Primer 5th笔记(chap 17 标准库特殊设施)正则表达式

C++ Primer 5th笔记(chap 17 标准库特殊设施)tuple 返回多个值

C++ Primer 5th笔记(chap 17 标准库特殊设施)控制输入格式

C++ Primer 5th笔记(chap 17 标准库特殊设施)bitset操作