tuple 库
tuple 库 是能够将不同类型的对象组合起来形成一个对象。和pair 对象一样,但是可以组织多种不同类型的元素。
tuple中的元素类型是在编译时期决定的。与<utility>中的pair 类密切相关, pair对象可以视为tuple类型对待。
头文件: <tuple>,
1. tuple 类
原型: template <class... Types> class tuple;
tuple对象可以组合不同元素, 每个元素的类型可以不同;
2. 成员函数
(constructor)
(1)默认构造函数,
构造tuple对象用元素初始值;
(2)copy/move 构造函数
通过另一个tuple对象来构造tuple对象
(3)隐式转换构造函数;
(4)初始自定义构造函数;
(5)pair 转化 构造函数
示例:
// tuple constructors #include <iostream> // std::cout #include <utility> // std::make_pair #include <tuple> // std::tuple, std::make_tuple, std::get int main () { std::tuple<int,char> first; // default std::tuple<int,char> second (first); // copy std::tuple<int,char> third (std::make_tuple(20,'b')); // move std::tuple<long,char> fourth (third); // implicit conversion std::tuple<int,char> fifth (10,'a'); // initialization std::tuple<int,char> sixth (std::make_pair(30,'c')); // from pair / move std::cout << "sixth contains: " << std::get<0>(sixth); std::cout << " and " << std::get<1>(sixth) << ' '; return 0; }
operator= 赋值函数
tuple:: swap 函数
void swap (tuple& tpl)
交换参数中的每个元素值。
3. Non-member function overloads
(1)逻辑比较
顺序比较两个不同的元素,指导发面不同,即作为结果。返回bool值。
(2) std::swap(a,b);
(3) std::get<i>(mytuple)
返回tuple 对象中的第i个元素的引用。
get同样用于tuple类似的类型,如pair, array等。
注意, 模板参数i来决定获取的索引位置,且必须是constexpr,即编译器为const value
返回参会参数是: tuple_element<i, tuple<type1, type2,...>>:: type 是 type对象中第i个元素的类型。
4. Helper classes
(1)std::tuple_size<T>类
用来获取tuple 对象中的元素数量的类模板。
模板参数T ,用于访问的tuple对象的类型。 即一个已经存在的类的声明。
类成员变量:value, 即类型T中的元素数量。
/ tuple_size #include <iostream> // std::cout #include <tuple> // std::tuple, std::tuple_size int main () { std::tuple<int,char,double> mytuple (10,'a',3.14); std::cout << "mytuple has "; std::cout << std::tuple_size<decltype(mytuple)>::value; std::cout << " elements." << ' '; return 0; }
(2)std::tuple_element<>类
被设计用来访问tuple对象中第i个元素类型的类。
具有成员类型 type, 即通过std::get<i>(tuple)访问第i个元素的类型。
#include <iostream> // std::cout #include <tuple> // std::tuple, std::make_tuple, std::tuple_element, std::get int main () { auto mytuple = std::make_tuple (10,'a'); std::tuple_element<0,decltype(mytuple)>::type first = std::get<0>(mytuple); std::tuple_element<1,decltype(mytuple)>::type second = std::get<1>(mytuple); std::cout << "mytuple contains: " << first << " and " << second << ' '; return 0; }
5.Functions
生成对象:
std::make_tuple<class... Types>
构建一个合适tuple类型的对象,并包含执行元素类型的参数。
函数返回的类型tuple<type,,,> 是在函数模板中定义的参数。
函数通过call tuple的初始构造函数。
// make_tuple example #include <iostream> #include <tuple> #include <functional> int main() { auto first = std::make_tuple (10,'a'); // tuple < int, char > const int a = 0; int b[3]; // decayed types: auto second = std::make_tuple (a,b); // tuple < int, int* > auto third = std::make_tuple (std::ref(a),"abc"); // tuple < const int&, const char* > std::cout << "third contains: " << std::get<0>(third); std::cout << " and " << std::get<1>(third); std::cout << std::endl; return 0; }
endl;