参考原文地址:
https://blog.csdn.net/chayalikemei/article/details/51105630
先上tuple使用的测试程序:
// 元组访问
std::tuple<int, int, vector<int>> tupleTest(1, 4, { 5,6,7,8 });
// 元组个数
int tupleTestSize = std::tuple_size<decltype(tupleTest)>::value;
cout << "tuple size is : " << tupleTestSize << endl;
auto first = get<0>(tupleTest);
cout << "first value is : " << first << endl;
auto second = get<1>(tupleTest);
cout << "second value is : " << second << endl;
auto third = get<2>(tupleTest);
for (const auto & iter : third)
{
cout << "third value is : " << iter << endl;
}
auto catTupleTest = make_tuple(1, 4);
// 元组合并
auto newTuple = std::tuple_cat(catTupleTest, tupleTest);
int newTupleSize = std::tuple_size<decltype(newTuple)>::value;
cout << "after cat, new tuple size is : " << newTupleSize << endl;
运行结果:
tuple size is : 3
first value is : 1
second value is : 4
third value is : 5
third value is : 6
third value is : 7
third value is : 8
after cat, new tuple size is : 5
了解tuple
- tuple是模板,tuple所有成员都是public的
- 使用tuple的相关操作,需要包含头文件。
- 希望将数据组合成单一对象时,使用tuple非常有用。(快而随意的数据结构)
- 一个tuple可以有任意数量的成员,tuple的成员类型也不相同。
- 一个确定的tuple类型的成员数目是固定的,意味着不能有添加和删除能够改变成员数目的操作。
定义和初始化tuple
- 1.当我们定义一个tuple时,需要指出每个成员的类型。创建tuple对象时,可以使用tuple的默认构造函数,该默认构造函数对每个成员进行 值初始化
tuple<int,float,size_t> threet;
- 2.初始化tuple:tuple的构造函数是 explicit 的,因此必须使用 直接初始化
tuple<size_t,size_t> tup={1,2,3};//错误
tuple<string,vector<double>,int,list<int>> someVal("tuple",{2.14,3.15},100,{1,2,3})//正确
tuple<int,int,double> some{2,3,3.15};//这样也行,注意与上面的括号
- 3.make_tuple函数:用来生成tuple对象,用初始值的类型推断tuple类型
auto itme=make_tuple("string",3,20.01);
//item的类型为tuple<const char*,int,double>
访问tuple的成员
- 1.get标准库模板:为了使用get获取tuple的成员,我们必须指定一个 显示模板实参(在<>里,<>里面的值必须是常量表达式),表示访问第几个成员。还需要传递给get一个tuple对象,返回指定成员的 引用。
get(m):m如果是一个左值,该表达式返回左值引用,否则是一个右值引用
auto itme = make_tuple("string", 3, 20.01);
auto book = get<1>(itme);//返回tuple对象item的第二个成员,从0开始计数
- 2.类模板tuple_size:查询tuple成员数量。
使用tuple_size需要知道tuple对象类型(类型推导使用 decltyple),tuple_size有一个public static的数据成员value,表示给定tuple中的成员数量。
auto itme = make_tuple("string", 3, 20.01);
auto sz = tuple_size<decltype(itme)>::value;//sz为3
- 3.类模板tuple_element:查询tuple成员的类型。tuple_element接受一个索引(从0开始)和一个tuple对象类型。tuple_element有一个public的成员type,表示给定tuple类型中指定成员的类型
auto itme = make_tuple("string", 3, 20.01);
tuple_element<1, decltype(itme)>::type ctype;//ctype的类型为int
关系和相等运算符
- 条件:只有2个tuple具有相同数量的成员,才可以比较。比较时,每对成员必须是合法的,简单来说就是2个tuple成员类型应该相同。
- 高级用法:从函数返回多个值。由于tuple定义了<和==运算符,因此还可以将tuple序列传递给算法,并且可以在无序容器中将tuple作为关键字类型。