尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
std::tuple 类型
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博客
RELATED

相关推荐

Flink CDC架构深度解析:构建企业级实时数据集成的最佳实践

Flink CDC架构深度解析:构建企业级实时数据集成的最佳实践

Flink CDC架构深度解析:构建企业级实时数据集成的最佳实践 【免费下载链接】flink-cdc Flink CDC is a streaming data integration tool 项目地址: https://gitcode.com/GitHub_Trending/flin/flink-cdc Apache Flink CDC作为新一代流式数据集成工具&#x…

📅 2026/11/5 21:54:08
如何高效提取Godot游戏资源:5步掌握godot-unpacker

如何高效提取Godot游戏资源:5步掌握godot-unpacker

如何高效提取Godot游戏资源:5步掌握godot-unpacker 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 你是否曾经想要探索Godot游戏的内部资源,却被.pck文件格式阻挡了脚步&…

📅 2026/10/7 1:31:15
揭秘Cython:从Python脚本到高性能C扩展的编译实战

揭秘Cython:从Python脚本到高性能C扩展的编译实战

1. 为什么需要Cython? Python作为一门解释型语言,在开发效率上确实无人能敌。但每次运行代码时,解释器都要逐行解析执行,这个特性让它在处理计算密集型任务时显得力不从心。我曾经用纯Python写过一个图像处理算法,处理…

📅 2026/11/11 1:16:58
MORE NEWS

更多资讯

📰

蓝田低压电工证值不值得考?怕考不过白交培训费的看过来

蓝田低压电工证值不值得考?怕考不过白交培训费的看过来 怕考不过白交培训费?蓝田低压电工证值不值得考?这是很多准备报考的学员心里最担心的问题。尤其是现在电工行业竞争激烈,很多单位要求必须持证上岗,而如果你没考过,不仅浪费了时间和金钱,还可能错…

📰

电工证国网报考流程郑州报考避坑指南

电工证国网报考流程郑州报考避坑指南 怕考不过白交培训费?郑州电工证报考避坑指南来了,手把手教你走通国网报考流程,避开培训机构套路,一次性拿证不踩坑。 电工证作为特种作业操作证的一种,是从事电气安装、维修、运行等工作的必备资质,…

📰

特种工培训刘老师揭秘通过率:证书过期了不知道怎么复审延期怎么办?

特种工培训刘老师揭秘通过率:证书过期了不知道怎么复审延期怎么办? 证书过期了不知道怎么复审延期?这几乎是每个特种作业人员最怕遇到的难题。特别是在高压电工、焊工、高处作业这些岗位上,一旦证书失效,不仅影响正常上岗,还可能面临被单位辞退甚至罚款…

📰

胶州哪里有办电工证郑州报考避坑指南

胶州哪里有办电工证郑州报考避坑指南 你是不是也和我一样,正为找工作发愁,却因为没有特种作业证而卡住了?别急,今天就给你讲讲【胶州哪里有办电工证】的真相,还有郑州电工证报考的避坑指南,让你少走弯路,顺利拿到证,早点上岗!…

📰

30天拿下铣刨机特种作业操作证,别再网上查询考不过的坑

30天拿下铣刨机特种作业操作证,别再网上查询考不过的坑 怕考不过白交培训费,这事儿我太懂了。去年我带着一帮濮阳房建工程的工友去考铣刨机特种作业操作证,结果有3个人因为没搞懂报名流程,花了几千块培训费最后还是没拿到证,直接气得跳脚。现在你要是…

📰

河津哪里办电工证千万别踩坑,实操考试心里没底怕挂科怎么办

河津哪里办电工证千万别踩坑,实操考试心里没底怕挂科怎么办 实操考试心里没底怕挂科,这是很多初次报考电工证的朋友最真实的写照。特别是在河津地区,报名点众多、信息杂乱,稍有不慎就可能踩坑,耽误时间和金钱。别急,咱们今天就来聊聊【河津哪里办电工证…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬