1. 元组简介std::tuple是类似std::pair的模板。每个pair的成员类型都不相同但每个pair都恰好有两个成员。不同std::tuple类型的成员类型也不相同但一个std::tuple可以有任意数量的成员。每个确定的std::tuple类型的成员数目是固定的但一个std::tuple类型的成员数目可以与另一个std::tuple类型不同。但我们希望将一些数据组合成单一对象但又不想麻烦地定义一个新数据结构来表示这些数据时std::tuple是非常有用的。我们可以将std::tuple看作一个”快速而随意”的数据结构。当我们定义一个std::tuple时需要指出每个成员的类型。当我们创建一个std::tuple对象时可以使用std::tuple的默认构造函数它会对每个成员进行值初始化也可以为每个成员提供一个初始值此时的构造函数是explicit的因此必须使用直接初始化方法。类似std::make_pair函数标准库定义了std::make_tuple函数我们还可以使用它来生成std::tuple对象。类似std::make_pairstd::make_tuple函数使用初始值的类型来推断std::tuple的类型。一个std::tuple类型的成员数目是没有限制的因此std::tuple的成员都是未命名的。要访问一个tstd::uple的成员就要使用一个名为std::get的标准库函数模板。为了使用std::get我们必须指定一个显式模板实参它指出我们想要访问第几个成员。我们传递给std::get一个std::tuple对象它返回指定成员的引用。std::get尖括号中的值必须是一个整型常量表达式。与往常一样我们从0开始计数意味着std::get0是第一个成员。为了使用tuple_size或tuple_element我们需要知道一个std::tuple对象的类型。与往常一样确定一个对象的类型的最简单方法就是使用decltype。std::tuple的关系和相等运算符的行为类似容器的对应操作。这些运算符逐对比较左侧tuple和右侧tuple的成员。只有两个std::tuple具有相同数量的成员时我们才可以比较它们。而且为了使用std::tuple的相等或不等运算符对每对成员使用运算符必须都是合法的为了使用关系运算符对每对成员使用必须都是合法的。由于std::tuple定义了和运算符我们可以将tuple序列传递给算法并且可以在无序容器中将std::tuple作为关键字类型。std::tuple的一个常见用途是从一个函数返回多个值。std::tuple是一个模板允许我们将多个不同类型的成员捆绑成单一对象。每个tuple包含指定数量的成员但对一个给定的tuple类型标准库并未限制我们可以定义的成员数量上限。std::tuple中元素是被紧密地存储的位于连续的内存区域而不是链式结构。std::tuple实现了多元组这是一个编译期就确定大小的容器可以容纳不同类型的元素。多元组类型在当前标准库中被定义为可以用任意数量参数初始化的类模板。每一模板参数确定多元组中一元素的类型。所以多元组是一个多类型、大小固定的值的集合。2. 官方文档介绍(C11 起)类模板std::tuple是固定大小的异类值汇集。它是 std::pair 的推广。3. 配合使用函数3.1. std::make_tuplestd::tupleint, int foo_tuple() { return {1, -1}; // N4387 前错误 return std::tupleint, int{1, -1}; // 始终有效, tuple可以使用初始化列表进行赋值。 return std::make_tuple(1, -1); // 始终有效 }3.2. std::get#include iostream #include string #include tuple int main() { auto t std::make_tuple(1, Foo, 3.14); // 基于下标的访问 std::cout ( std::get0(t) , std::get1(t) , std::get2(t) )\n; // 基于类型的访问 C14 起 std::cout ( std::getint(t) , std::getconst char*(t) , std::getdouble(t) )\n; // 注意 std::tie 和结构化绑定亦可用于分解 tuple }3.3. std::tie#include tuple #include iostream #include string #include stdexcept std::tupledouble, char, std::string get_student(int id) { if (id 0) return std::make_tuple(3.8, A, Lisa Simpson); //生成一个std::tuple if (id 1) return std::make_tuple(2.9, C, Milhouse Van Houten); if (id 2) return std::make_tuple(1.7, D, Ralph Wiggum); throw std::invalid_argument(id); } int main() { auto student0 get_student(0); std::cout ID: 0, GPA: std::get0(student0) , //std::get用于取出tuple中的某个值 grade: std::get1(student0) , name: std::get2(student0) \n; double gpa1; char grade1; std::string name1; std::tie(gpa1, grade1, name1) get_student(1);//std::tie的用法std::tie会将变量的引用整合成一个tuple从而实现批量赋值 std::cout ID: 1, GPA: gpa1 , grade: grade1 , name: name1 \n; // C17 结构化绑定 auto [ gpa2, grade2, name2 ] get_student(2); std::cout ID: 2, GPA: gpa2 , grade: grade2 , name: name2 \n; }3.4. std::ignore使用std::ignore忽略某些tuple中的某些返回值double gpa1; std::string name1; std::tie(gpa1, ignore, name1) get_student(1);3.4. std::forward_as_tuple构造对 args 中参数的引用元组适合作为函数的参数转发。当右值用作参数时元组具有右值引用数据成员否则具有左值引用数据成员。#include iostream #include map #include tuple #include string int main() { std::mapint, std::string m; m.emplace(std::piecewise_construct, std::forward_as_tuple(10), std::forward_as_tuple(20, a)); std::cout m[10] m[10] \n; // The following is an error: it produces a // std::tupleint, char holding two dangling references. // // auto t std::forward_as_tuple(20, a); // m.emplace(std::piecewise_construct, std::forward_as_tuple(10), t); }Outputm[10] aaaaaaaaaaaaaaaaaaaavoid print_pack(std::tuplestd::string, int pack) { std::cout std::get0(pack) , std::get1(pack) \n; } print_pack(std::forward_as_tuple(str Smith, 25)); print_pack(std::forward_as_tuple(str Daniels, 22));参考文献CSTL之tuple类型_tie函数_get函数_Peace-CSDN博客std::forward_as_tuple - cppreference.comC11中std::tuple的使用_网络资源是无限的-CSDN博客
std::tuple 类型
发布时间:2026/7/14 13:16:07
1. 元组简介std::tuple是类似std::pair的模板。每个pair的成员类型都不相同但每个pair都恰好有两个成员。不同std::tuple类型的成员类型也不相同但一个std::tuple可以有任意数量的成员。每个确定的std::tuple类型的成员数目是固定的但一个std::tuple类型的成员数目可以与另一个std::tuple类型不同。但我们希望将一些数据组合成单一对象但又不想麻烦地定义一个新数据结构来表示这些数据时std::tuple是非常有用的。我们可以将std::tuple看作一个”快速而随意”的数据结构。当我们定义一个std::tuple时需要指出每个成员的类型。当我们创建一个std::tuple对象时可以使用std::tuple的默认构造函数它会对每个成员进行值初始化也可以为每个成员提供一个初始值此时的构造函数是explicit的因此必须使用直接初始化方法。类似std::make_pair函数标准库定义了std::make_tuple函数我们还可以使用它来生成std::tuple对象。类似std::make_pairstd::make_tuple函数使用初始值的类型来推断std::tuple的类型。一个std::tuple类型的成员数目是没有限制的因此std::tuple的成员都是未命名的。要访问一个tstd::uple的成员就要使用一个名为std::get的标准库函数模板。为了使用std::get我们必须指定一个显式模板实参它指出我们想要访问第几个成员。我们传递给std::get一个std::tuple对象它返回指定成员的引用。std::get尖括号中的值必须是一个整型常量表达式。与往常一样我们从0开始计数意味着std::get0是第一个成员。为了使用tuple_size或tuple_element我们需要知道一个std::tuple对象的类型。与往常一样确定一个对象的类型的最简单方法就是使用decltype。std::tuple的关系和相等运算符的行为类似容器的对应操作。这些运算符逐对比较左侧tuple和右侧tuple的成员。只有两个std::tuple具有相同数量的成员时我们才可以比较它们。而且为了使用std::tuple的相等或不等运算符对每对成员使用运算符必须都是合法的为了使用关系运算符对每对成员使用必须都是合法的。由于std::tuple定义了和运算符我们可以将tuple序列传递给算法并且可以在无序容器中将std::tuple作为关键字类型。std::tuple的一个常见用途是从一个函数返回多个值。std::tuple是一个模板允许我们将多个不同类型的成员捆绑成单一对象。每个tuple包含指定数量的成员但对一个给定的tuple类型标准库并未限制我们可以定义的成员数量上限。std::tuple中元素是被紧密地存储的位于连续的内存区域而不是链式结构。std::tuple实现了多元组这是一个编译期就确定大小的容器可以容纳不同类型的元素。多元组类型在当前标准库中被定义为可以用任意数量参数初始化的类模板。每一模板参数确定多元组中一元素的类型。所以多元组是一个多类型、大小固定的值的集合。2. 官方文档介绍(C11 起)类模板std::tuple是固定大小的异类值汇集。它是 std::pair 的推广。3. 配合使用函数3.1. std::make_tuplestd::tupleint, int foo_tuple() { return {1, -1}; // N4387 前错误 return std::tupleint, int{1, -1}; // 始终有效, tuple可以使用初始化列表进行赋值。 return std::make_tuple(1, -1); // 始终有效 }3.2. std::get#include iostream #include string #include tuple int main() { auto t std::make_tuple(1, Foo, 3.14); // 基于下标的访问 std::cout ( std::get0(t) , std::get1(t) , std::get2(t) )\n; // 基于类型的访问 C14 起 std::cout ( std::getint(t) , std::getconst char*(t) , std::getdouble(t) )\n; // 注意 std::tie 和结构化绑定亦可用于分解 tuple }3.3. std::tie#include tuple #include iostream #include string #include stdexcept std::tupledouble, char, std::string get_student(int id) { if (id 0) return std::make_tuple(3.8, A, Lisa Simpson); //生成一个std::tuple if (id 1) return std::make_tuple(2.9, C, Milhouse Van Houten); if (id 2) return std::make_tuple(1.7, D, Ralph Wiggum); throw std::invalid_argument(id); } int main() { auto student0 get_student(0); std::cout ID: 0, GPA: std::get0(student0) , //std::get用于取出tuple中的某个值 grade: std::get1(student0) , name: std::get2(student0) \n; double gpa1; char grade1; std::string name1; std::tie(gpa1, grade1, name1) get_student(1);//std::tie的用法std::tie会将变量的引用整合成一个tuple从而实现批量赋值 std::cout ID: 1, GPA: gpa1 , grade: grade1 , name: name1 \n; // C17 结构化绑定 auto [ gpa2, grade2, name2 ] get_student(2); std::cout ID: 2, GPA: gpa2 , grade: grade2 , name: name2 \n; }3.4. std::ignore使用std::ignore忽略某些tuple中的某些返回值double gpa1; std::string name1; std::tie(gpa1, ignore, name1) get_student(1);3.4. std::forward_as_tuple构造对 args 中参数的引用元组适合作为函数的参数转发。当右值用作参数时元组具有右值引用数据成员否则具有左值引用数据成员。#include iostream #include map #include tuple #include string int main() { std::mapint, std::string m; m.emplace(std::piecewise_construct, std::forward_as_tuple(10), std::forward_as_tuple(20, a)); std::cout m[10] m[10] \n; // The following is an error: it produces a // std::tupleint, char holding two dangling references. // // auto t std::forward_as_tuple(20, a); // m.emplace(std::piecewise_construct, std::forward_as_tuple(10), t); }Outputm[10] aaaaaaaaaaaaaaaaaaaavoid print_pack(std::tuplestd::string, int pack) { std::cout std::get0(pack) , std::get1(pack) \n; } print_pack(std::forward_as_tuple(str Smith, 25)); print_pack(std::forward_as_tuple(str Daniels, 22));参考文献CSTL之tuple类型_tie函数_get函数_Peace-CSDN博客std::forward_as_tuple - cppreference.comC11中std::tuple的使用_网络资源是无限的-CSDN博客