C++ Primer笔记——tuple类型

2023-11-08

tuple类型

《C++ Primer》 17.1 tuple类型(P636)

tuple是一种定义在标准库中的类似于pair的模板。pair的成员为两个不同的类型,tuple同样要求成员类型不同,但是tuple可以有任意数量的成员

(一).定义

定义一个tuple对象时,可以使用默认的构造函数,它会为每个成员进行默认初始化。当然也可以手动初始化。

tuple<int, string, int> tp1;//使用默认构造进行初始化
tuple<int, string, int> tp2{ 1, "hello", 2 };//自定义直接初始化
tuple<int, string, int> tp3 = { 1, "hello", 2 };//错误,并非直接初始化

值得注意的是,《C++ Primer》说“tuple的构造函数是explicit,因此必须使用直接初始化”,因此tp3应该编译失败。但是在VS2019环境实测中,编译是正常通过的,应该是VS对tuple类型进行了优化,支持了隐式类型转换。

类似make_pair函数,标准库定义了make_tuple函数来生成tuple对象:

auto tp4 = make_tuple<int, string, int>(1, "hello", 2);
auto tp5 = make_tuple(1, "hello", 2);

需要说明的是,如果没有为make_tuple指明变量类型, 例如“hello”就会默认是const char*类型。

(二).使用

访问tuple成员时,需要使用名为get的标准库函数模板,用法如下:

auto tp1 = make_tuple<int, string, int>(1, "hello", 2);
int a = get<0>(tp1);
string str = get<1>(tp1);
int b = get<2>(tp1);

当我们访问tuple成员时,从0开始计数,因此get<0>的含义是tuple的第一个成员。

get函数所返回的是成员的引用

获取未知tuple对象的类型

auto tp1 = make_tuple<int, string, int>(1, "hello", 2);
typedef decltype(tp1) TUPLE_TYPE;//使用decltype来获取tp1的类型
TUPLE_TYPE tp2;
//获取tp1的类型,定义别名为TUPLE_TYPE,来定义对象tp2。

获取tuple中成员总数

size_t sz = tuple_size<TUPLE_TYPE>::value;

获取tuple某个具体成员的类型

tuple_element<0, TUPLE_TYPE>::type a = get<0>(tp1);
//a类型为int,即tp1第一个成员的类型。

 tuple对象间关系运算

只能是同类型同数量成员的tuple才能比较。

在比较时与string类似,按照成员顺序依次对比,当前成员对比不同时,tuple对比结果即当前成员对比结果;当前成员对比相同时,对比下一个成员。

auto tp1 = make_tuple<int, int>(6, 2);
auto tp2 = make_tuple<int, int>(1, 9);
auto tp3 = make_tuple<string, string>("world", "hello");
bool judge1 = (tp1 > tp2);//结果为1
bool judge2 = (tp1 == tp2);//结果为0
bool judge3 = (tp1 > tp3);//错误,成员类型不同

  tuple交换数据

auto tp1 = tuple<int, int, string>(1, 2, "");
auto tp2 = tuple<int, int, string>(3, 4, "world");
tp2.swap(tp1);//数据交换

  tuple解包

auto tp1 = tuple<int, int, string>(1, 2, "");
auto tp2 = tuple<int, int, string>(3, 4, "world");
int a, b; 
string str;
tie(a, b, str) = tp2;//使用tie来解包

(三).作为返回值

tuple作为返回值时可以间接返回多个值,可理解成将多个返回值“打包”后返回。

tuple<int, string, int> func(int a, int b, string str)
{
	return tuple<int, string, int>(a, str, b);
}

int main()
{
	auto ret = func(1, 2, "hello");
	cout << get<0>(ret);
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Primer笔记——tuple类型 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项

随机推荐

  • python 语言 实现一个WEB登陆应用程序

    实现一个 Python 语言的 WEB 登录应用程序需要掌握一些基础知识 例如 HTTP 协议 网络编程 加密算法等 以下是一个基本的框架 供参考 熟悉 HTTP 协议和 Web 服务器与客户端的基本通信机制 使用 Python 的网络编程
  • 使用Python将pyd文件打包成安装包whl

    先说效果 可以将一个或多个py文件编译为源码不可见的 pyd文件 同时将pyd文件打包为whl文件 他人使用时 只需要将whl文件发送过去 对方通过安装whl文件 就可以将你写的代码文件 库文件 安装到python环境了 首先将py代码文件
  • 前后端分离技术逐步深入,让你更加深入理解Nginx+Tomcat

    你提到了熟悉Tomcat和Nginx服务器的配置 以及应用前后端分离技术 请解释一下Tomcat和Nginx的主要作用是什么 以及在前后端分离中它们的角色是什么 标准回答 Tomcat是一个Java应用服务器 主要用于运行Java Web应
  • 【pytorch目标检测】开山之作:R-CNN算法解读

    背景 将 深度学习 和传统的 计算机视觉 的知识相结合 没有过多的使用深度学习 2014年将PASCALVOC数据集检测率从35 提升到53 具体步骤 总体的步骤图 1 候选区域生成 ROI Regions of Interst Selec
  • C++ 知识图谱

    在学习多年的c 后发现很多知识点非常零碎不够系统 借鉴看过的 c primer 做一下总结 方便自己学习 这个专栏的定位是具备c 基础的开发工程师 系统的总结c 知识 避免出现知识空白 并不会像书中那样非常详细的介绍每个特性和知识点 而只会
  • 五种混沌映射的种群初始化(可适用多数算法改进)附Matlab代码

    沌映射被用于生成混沌序列 这是一种由简单的确定性系统产生的随机性序列 一般混沌序列具有以下主要特征 非线性 对初值的敏感依赖性 遍历性 随机性 奇异吸引子 混沌吸引子 分数维持性 整体稳定局部不稳定 长期不可预测性 轨道不稳定性及分叉 普适
  • React学习笔记

    1 起步 创建项目 npx create react app project name Vscode React插件安装 添加该依赖后 rcc 和 rfc可以创建组件的方法 快速启动的代码块 rcc react class componen
  • 【电子电路】电子基础基本知识和面试要点

    1 晶体管基本放大电路有共射 共集 共基三种接法 请简述这三种基本放大电路的特点 共射 共射放大电路具有放大电流和电压的作用 输入电阻大小居中 输出电阻较大 频带较窄 适用于一般放大 共集 共集放大电路只有电流放大作用 输入电阻高 输出电阻
  • 最新!CVPR 2021 视觉Transformer论文大盘点(43篇)

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 作者 Amusi 来源 CVer 前言 从2020下半年开始 特别是2021上半年 Visual Transformer的研究热点达到了前所未有的高峰 Amusi 认为
  • SpringBoot的使用

    SpringBoot的使用 文章目录 SpringBoot的使用 一 引言 1 1 初始化配置 1 2 整合第三方框架 1 3 后期维护 1 4 部署工程 1 5 敏捷式开发 二 SpringBoot介绍 三 SpringBoot快速入门
  • Ubuntu 20.04 安装 mysql 并配置远程访问

    文章目录 一 使用 apt 安装 mysql 服务 二 初始化 mysql 数据库管理员用户密码 三 配置远程访问 一 使用 apt 安装 mysql 服务 更新软件包列表 apt update 安装mysql服务 apt install
  • App UI自动化测试必备:元素定位方法大揭秘

    今天给大家分享App UI自动化测试中常用的元素定位方法 一 通过ID定位 对应 resource id 属性 示例 self driver find element AppiumBy ID 二 通过Name定位 对应 text 属性 示例
  • 【Git学习笔记5】以普通模式合并(--no-ff)、push到远程库及分支管理策略

    一 以普通模式合并 no ff 合并分支时 如果可能 Git会用Fast forward模式 但这种模式下 删除分支后 会丢掉分支信息 啥 不记得啦 那等会我们学习完给你再举个栗子吧 看看这个fast forward的示意图 如果要强制禁用
  • 倾斜补偿的电子罗盘(2):磁传感器的误差来源、硬磁干扰的校准(3个参数)、实验验证

    电子罗盘 2 磁传感器的误差来源 硬磁干扰的校准 3个参数 实验验证 文章目录 理想情况 误差来源 内部 外部 误差模型 硬磁干扰的校准 3个参数 使用的模型 最小二乘法 实测结果 总结 代码和资料 MATLAB代码 参考资料 样机 理想情
  • eclipse删除workspace空间&workspace配置

    eclipse workspace 配置文件 1 位置 eclipse configuration settings gt org eclipse ui ide prefs 2 参数RECENT WORKSPACES gt 工作空间配置 备
  • mysql面试题走一波

    2019mysql面试题案例分享 1 现有login logs日志表 用来记录用户登录的信息情况 字段有 uid create time 时间格式为 yyyy mm dd i m s 用sql语句查出 2017 06 01日登录次数超过3次
  • 从键盘输入三个数到a,b,c中,按公式值输出 (30 分) 在同一行依次输入三个值a,b,c,用空格分开,输出 b*b-4*a*c的值

    第1章 2 从键盘输入三个数到a b c中 按公式值输出 30 分 在同一行依次输入三个值a b c 用空格分开 输出 bb 4a c的值 输入格式 在一行中输入三个数 输出格式 在一行中输出公式值 输入样例 在这里给出一组输入 例如 3
  • matlab trisys,Matlab实现——严格对角占优三对角方程组求解(高斯赛尔德Gauss-Seidel迭代、超松弛)

    严格对角占优三对角方程组求解 对中等规模的n阶的 n lt 100 线性方程组 直接法的准确性和可靠性 所以常采用直接法 对于较高阶的方程组 特别是地于某些偏微分方程离散化后得到的大型稀疏方程组 系统矩 阵绝大多数为零元素 由于直接解法的计
  • AIGC和智能数字化新时代

    目录 AIGC的意义 AIGC底座及生态 AIGC赋能内容创作4大模态 AI文本生成 AI音频生成 AI图像生成 AI视频生成 AIGC的技术思想 AIGC的重要基建Transformer ChatGPT的训练过程示意图 ChatGPT的局
  • C++ Primer笔记——tuple类型

    tuple类型 C Primer 17 1 tuple类型 P636 tuple是一种定义在标准库中的类似于pair的模板 pair的成员为两个不同的类型 tuple同样要求成员类型不同 但是tuple可以有任意数量的成员 一 定义 定义一