尧图网络 高端网站定制 · 原创设计
免费咨询热线
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/9/4 16:34:14
如何高效提取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/8/20 20:36:53
揭秘Cython:从Python脚本到高性能C扩展的编译实战

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

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

📅 2026/8/21 22:02:50
MORE NEWS

更多资讯

📰

Slint UI 视觉打磨实战指南:间距、色彩、组件状态与截图审查

Slint UI 视觉打磨实战指南:间距、色彩、组件状态与截图审查 【免费下载链接】slint Slint is an open-source declarative GUI toolkit to build native user interfaces for Rust, C, JavaScript, or Python apps. 项目地址: https://gitcode.com/GitHub_Trendi…

📰

@ai-sdk/harness-grok-build 演进全解析:AI SDK 中基于 ACP 的 Grok Build Harness 适配器

ai-sdk/harness-grok-build 演进全解析:AI SDK 中基于 ACP 的 Grok Build Harness 适配器 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and…

📰

为什么 ESP32 开发板插上电脑没反应:arduino-esp32 新手安装与点亮 LED 完整指南

为什么 ESP32 开发板插上电脑没反应:arduino-esp32 新手安装与点亮 LED 完整指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 深夜 11 点,新拆封…

📰

Kafka认证机制详解:SCRAM与PLAIN对比与实践

1. Kafka认证机制概述 在分布式消息系统中,认证机制是保障数据安全的第一道防线。Kafka作为主流消息中间件,提供了多种客户端认证方式,其中SCRAM和PLAIN是SASL框架下最常用的两种机制。这两种机制虽然都基于用户名/密码的验证模式&#xff0c…

📰

Diffusers 潜空间一致性蒸馏(Latent Consistency Distillation)完整训练指南:从 Stable Diffusion 教师模型到少步数 LCM

Diffusers 潜空间一致性蒸馏(Latent Consistency Distillation)完整训练指南:从 Stable Diffusion 教师模型到少步数 LCM 【免费下载链接】diffusers 🤗 Diffusers: State-of-the-art diffusion models for image, video, and aud…

📰

simulink的MCU‑电机效率 MAP 在 NEDC 工况仿真方法

目录 一、为什么要做 MCU + 电机效率 MAP 在 NEDC 工况 二、效率 MAP 与 NEDC 映射原理 2.1 典型效率 MAP(简化数学构造) 2.2 NEDC → 电机点 三、关键参数 四、Simulink 建模(手把手) 4.1 Step 1️⃣ —— NEDC 车速剖面 4.2 Step 2️⃣ —— 车速 → 电机 (n_mot …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬