C++ tuple元组的基本用法(总结)

2023-11-18

1,元组简介

    tuple是一个固定大小的不同类型值的集合,是泛化的std::pair。我们也可以把他当做一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体使程序更简洁,直观。std::tuple理论上可以有无数个任意类型的成员变量,而std::pair只能是2个成员,因此在需要保存3个及以上的数据时就需要使用tuple元组了。

    tuple(元组)在c++11中开始引用的。tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多细节,要揭开它神秘的面纱时又比较困难。

2,tuple的创建和初始化


std::tuple<T1, T2, TN> t1;            //创建一个空的tuple对象(使用默认构造),它对应的元素分别是T1和T2...Tn类型,采用值初始化。
std::tuple<T1, T2, TN> t2(v1, v2, ... TN);    //创建一个tuple对象,它的两个元素分别是T1和T2 ...Tn类型; 要获取元素的值需要通过tuple的成员get<Ith>(obj)进行获取(Ith是指获取在tuple中的第几个元素,请看后面具体实例)。
std::tuple<T1&> t3(ref&); // tuple的元素类型可以是一个引用
std::make_tuple(v1, v2); // 像pair一样也可以通过make_tuple进行创建一个tuple对象

 tuple的元素类型为引用:

std::string name;
std::tuple<string &, int> tpRef(name, 30);
// 对tpRef第一个元素赋值,同时name也被赋值 - 引用
std::get<0>(tpRef) = "Sven";

// name输出也是Sven
std::cout << "name: " << name << '\n';

3,有关tuple元素的操作

  1. 等价结构体

      开篇讲过在某些时候tuple可以等同于结构体一样使用,这样既方便又快捷。如:

struct person {
    char *m_name;
    char *m_addr;
    int  *m_ages;
};

//可以用tuple来表示这样的一个结构类型,作用是一样的。
std::tuple<const char *, const char *, int>

    2. 如何获取tuple元素个数

    当有一个tuple对象但不知道有多少元素可以通过如下查询:

// 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." << '\n';

  return 0;
}

//输出结果:
mytuple has 3 elements

    3.如何获取元素的值

获取tuple对象元素的值可以通过get<Ith>(obj)方法进行获取;

Ith - 是想获取的元素在tuple对象中的位置。

obj - 是想获取tuple的对象

// 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." << '\n';

  //获取元素
  std::cout << "the elements is: ";
  std::cout << std::get<0>(mytuple) << " ";
  std::cout << std::get<1>(mytuple) << " ";
  std::cout << std::get<2>(mytuple) << " ";

  std::cout << '\n';

  return 0;
}

//输出结果:
mytuple has 3 elements.
the elements is: 10 a 3.14 

   tuple不支持迭代,只能通过元素索引(或tie解包)进行获取元素的值。但是给定的索引必须是在编译器就已经给定,不能在运行期进行动态传递,否则将发生编译错误:

for(int i=0; i<3; i++)
    std::cout << std::get<i>(mytuple) << " "; //将引发编译错误

4.获取元素的类型

 要想得到元素类型可以通过tuple_element方法获取,如有以下元组对象:

std::tuple<std::string, int> tp("Sven", 20);

// 得到第二个元素类型

std::tuple_element<1, decltype(tp)>::type ages;  // ages就为int类型

ages = std::get<1>(tp);

std::cout << "ages: " << ages << '\n';

//输出结果: 
ages: 20

 5.利用tie进行解包元素的值

 如同pair一样也是可以通过tie进行解包tuple的各个元素的值。如下tuple对象有4个元素,通过tie解包将会把这4个元素的值分别赋值给tie提供的4个变量中。

#include <iostream>
#include <tuple>
#include <utility>

int main(int argc, char **argv) {
    std::tuple<std::string, int, std::string, int> tp;
    tp = std::make_tuple("Sven", 25, "Shanghai", 21);

    // 定义接收变量
    std::string name;
    std::string addr;
    int ages;
    int areaCode;

    std::tie(name, ages, addr, areaCode) = tp;
    std::cout << "Output: " << '\n';
    std::cout << "name: " << name <<", ";
    std::cout << "addr: " << addr << ", ";
    std::cout << "ages: " << ages << ", ";
    std::cout << "areaCode: " << areaCode << '\n';

    return 0;
}

//输出结果:
Output: 
name: Sven, addr: Shanghai, ages: 25, areaCode: 21

但有时候tuple包含的多个元素时只需要其中的一个或两个元素,如此可以通过std::ignore进行变量占位,这样将会忽略提取对应的元素。可以修改上述例程:

#include <iostream>
#include <tuple>
#include <utility>

int main(int argc, char **argv) {
    std::tuple<std::string, int, std::string, int> tp;
    tp = std::make_tuple("Sven", 25, "Shanghai", 21);

    // 定义接收变量
    std::string name;
    std::string addr;
    int ages;
    int areaCode = 110;

    std::tie(name, ages, std::ignore, std::ignore) = tp;
    std::cout << "Output: " << '\n';
    std::cout << "name: " << name <<", ";
    std::cout << "addr: " << addr << ", ";
    std::cout << "ages: " << ages << ", ";
    std::cout << "areaCode: " << areaCode << '\n';

    return 0;
}

//输出结果:
Output: 
name: Sven, addr: , ages: 25, areaCode: 110

   6. tuple元素的引用

      前面已经列举了将引用作为tuple的元素类型。下面通过引用搭配make_tuple()可以提取tuple的元素值,将某些变量值设给它们,并通过改变这些变量来改变tuple元素的值:

#include <iostream>
#include <tuple>
#include <functional>

int main(int argc, char **agrv) {

    std::tuple<std::string, int, float> tp1("Sven Cheng", 77, 66.1);

    std::string name;
    int weight;
    float f;

    auto tp2 = std::make_tuple(std::ref(name), std::ref(weight), std::ref(f)) = tp1;

    std::cout << "Before change: " << '\n';
    std::cout << "name: " << name << ", ";
    std::cout << "weight: " << weight << ", ";
    std::cout << "f: " << f << '\n';

    name = "Sven";
    weight = 80;
    f = 3.14;

	std::cout << "After change: " << '\n';
	std::cout << "element 1st: " << std::get<0>(tp2) << ", ";
	std::cout << "element 2nd: " << std::get<1>(tp2) << ", ";
	std::cout << "element 3rd: " << std::get<2>(tp2) << '\n';

    return 0;
}

//输出结果:
Before change: 
name: Sven Cheng, weight: 77, f: 66.1
After change: 
element 1st: Sven, element 2nd: 80, element 3rd: 3.14


 

 

 

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

C++ tuple元组的基本用法(总结) 的相关文章

  • 【软件测试】Git详细-获取Git仓库,全网最全一篇打通...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • rockylinux简单安装

    前言 官网 https rockylinux org 阿里云 https mirrors aliyun com rockylinux 下载地址 最小镜像只有2G https mirrors aliyun com rockylinux 8 8
  • 色 彩 RGB 值 对 照 表

    参见 https blog csdn net bravegogo article details 52119723
  • 【论文翻译】Convolutional Oriented Boundaries

    目标轮廓检测与全卷积编解码器网络 摘要 本文实现一种基于全卷积编解码器网络的轮廓检测深度学习算法 1 与以往的低级边缘检测不同 该算法重点是检测高级对象轮廓 算法网络是在PASCALVOC上进行端到端训练的 从不准确的多边形注释中提炼出gr
  • ubuntu 安装docker

    Ubuntu 安装 Docker CE 警告 切勿在没有配置 Docker APT 源的情况下直接使用 apt 命令安装 Docker 准备工作 系统要求 Docker CE 支持以下版本的 Ubuntu 操作系统 Artful 17 10
  • 【温故知新】深度学习中的Dropout

    今天仔细看了一下AlexNet 发现最后有个dropout层 按以前理解还以为类似降采样 图片来自这里 出现原因 神经网络神经元可能过多 会导致过拟合 所以dropout作用就是随机删减一些神经元 给定删减概率p 如下图 图片来自这里 具体
  • Crest Ocean System URP

    https assetstore unity com packages tools particles effects crest ocean system urp 141674
  • python语法-模块

    python语法 模块 模块的导入 导入语法 from 模块名 improt 模块 类 变量 函数 as 别名 演示模块导入 import time print hello time sleep 5 print world 自定义模块并导入
  • Cuda 编程 矩阵转置

    将矩阵分块进行转置 输入矩阵 输出矩阵 include
  • 递归算法与非递归算法效率的一般计算方法

    1 非递归算法 1 首先确定一个参数n来表示输入的大小 2 分析算法的基本操作 一般在循环的最里层 3 判断算法需要执行基本操作的次数是否只与n有关 如果它还与其他因数有关 则需要分开考虑算法的最好 最坏 平均情况 4 建立一个计算算法需要
  • java 导出excel实例(内含通用excel导出工具类)

    1 创建一个ExportPropertiesDto 用于动态导出表头 前端传过来的json数组类似 field year fieldName 年份 field departmentName fieldName 部门 field typeNa
  • 机器学习基础线性回归——预测网店的销售额

    线性回归 步骤 明确定义所要解决的问题 网店销售额的预测 在数据的收集与预处理环节 分五个环节完成数据的预处理工作 分别如下 1 收集数据 需要提供的网店的相关记录 2 将收集到的数据可视化 显示出来看一看 3 做特征工程 使数据更容易被机
  • python使用时间戳计算运行时间

    时间戳计算运行时间 from time import time time 记下每一次time 这一行命令时的时间戳 时间戳是一行数字 用来记录此时此刻的时间 t0 time 当前时间 for i in range 10 print i i
  • Java内存分区

    1 简介 内存全称电子计算机内存储器 用于暂时存储CPU中运行的数据以及与磁盘交换的数据 它是硬件存储与CPU进行沟通的桥梁 计算机中的所有程序进行都在内存中进行 所以java程序要想运行必须要在内存中申请一块空间 java内存中可以分为堆
  • 编译出错 程序中有游离的‘\302‘

    编者按 复制别人的代码到Linux中运行 在编译时出错 错误 程序中有游离的 302 查找资料后获取解决方法 在此做一个记录 错误提示如下 read c 164 6 错误 程序中有游离的 302 read c 164 6 错误 程序中有游离
  • 系统邮件模板的邮箱兼容性

    近期支付宝的系统邮件进行了一次改版 在这次改版的过程中 我们遇到了很多在网页中显示正常的html邮件在邮箱中显示异常的问题 下面我们把遇到的问题和一些常用的代码书写规则和大家分享 共性问题 许多邮箱都会出现的问题 1 字体大小会发生变化 排
  • 项目管理2:电子项目研发流程安排

    电子项目研发流程安排 项目研发各阶段安排 1 方案选型阶段 1 所做工作 方案调研 选型 可行性研究 2 设备采购 参考设备 参考方案 demo 注 此阶段全面初步了解设备需求 制定方案 采购验证用设备 2 方案验证阶段 1 所做工作 方案
  • jdbc,prepareStatement,表名为变量时无法使用占位符‘?’

    java操作有些数据库比如clickhouse暂时还用的是jdbc 执行sql时面临使用statement还是prepareStatement 其中statement写的简单不过会有sql注入最后安全检查不过 prepareStatemen

随机推荐

  • ctf文件包含+伪协议总结

    基本原理 后端编程人员一般会把重复使用的函数写到单个文件中 需要使用时再直接调用此文件即可 该过程也就被称为文件包含 文件包含的存在使得开发变得更加灵活和方便 但同时也带了安全问题 导致客户端可以远程调用文件 造成文件包含漏洞 这个漏洞在p
  • C++ 负数转二进制形式

    C 负数转二进制形式 1 十进制的负数转成二进制形式 include
  • 【VsCode远程开发】Windows SSH远程连接Linux服务器 - 无公网IP内网穿透

    文章目录 前言 视频教程 1 安装OpenSSH 2 vscode配置ssh 3 局域网测试连接远程服务器 4 公网远程连接 4 1 ubuntu安装cpolar内网穿透 4 2 创建隧道映射 4 3 测试公网远程连接 5 配置固定TCP端
  • Pandas中五个常见操作小结

    1 引言 Pandas是专门为csv excel等表格数据创建的数据分析 可视化和操作的第三方库 其中DataFrame是一种二维数据结构 它一般是由行和列组成的表格数据 在Python3中使用Pandas库 可以方便我们对表格数据执行相应
  • php 密码校验正则,PHP常用密码正则匹配验证

    PHP常用密码正则匹配验证 第一种 昵称2 10位字符 需由中文 数字 字母 区分大小写 和下划线组合 a 的方 b preg match x 4e00 x 9fa5 A Za z0 9 2 10 u a var dump b 第二种 正则
  • 备战2023蓝桥国赛-饼干

    题目描述 解析 这道题我想了很多种解决方法 但无一例外都失败了 实在是按照常规线性DP的思路真的想不出来 看了题解之后才知道它是分为三步解决这个问题的 第一步 缩小最优解的范围 先用贪心将最优解缩小到某个较小的范围内 再DP求出精确的最优解
  • 【C语言】C语言入门经典题目(范围广,内容多)

    作者 小孙的代码分享 专栏 C语言入门 送给各位的一句话 空杯心态 才能学到新知 希望大家看完这些题目有所收获 别忘了 点赞 评论 目录 前言 字符转ASCII码 判断闰年 简单计算器 包含数字9的数 十六进制转十进制 获得月份天数 求质数
  • MybatisPlus的注解

    MybatisPlus的注解 TableField exist false 表示该属性不为数据库表字段 但又是必须使用的 TableField exist true 表示该属性为数据库表字段 Mybatis Plus 插件有这个功能 可以看
  • RestTemplate使用详解

    文章目录 一 RestTemplate 简单使用 1 创建 RestTemplate 2 接口调用 二 其他设置 1 拦截器配置 2 ErrorHandler 配置 3 HttpMessageConverter 配置 在项目中 当我们需要远
  • 用Vscode编辑verilog代码配置

    这篇教程感觉很详细了 我这里分享一下vscode和插件的安装包链接 都是官网下载的 放心食用 用VSCode编辑verilog代码 iverilog编译 自动例化 自动补全 自动格式化等常用插件 链接 https pan baidu com
  • linux找共享内存

    find proc maps type f exec grep l lt 34865209 gt
  • Spring的IOC,DI和AOP

    spring的优点 IOC和DI降低了组件之间的耦合性 让程序员更专注于业务逻辑 容器提供了众多的辅助类 能加快应用的开发 spring对于主流的应用框架提供了集成支持 如hibernate mybatis Struts等 spring属于
  • 成都瀚网科技有限公司:新手如何做直播?

    越来越多的人涌入这一领域 希望通过直播实现爆发式销售 然而 要想在竞争激烈的市场中脱颖而出 新手需要掌握一些关键技巧和策略 在这篇文章中 我们将分享一些实用的方法 帮助新手实现抖音销量爆发的目标 1 新手如何做直播 选择合适的产品 作为新手
  • 认识常见的显卡外接口

    以下几种为显卡接口的常见类型 1 VGA接口 Video Graphics Array 视频图形阵列 VGA接口是最常见的 应用最广的显卡接口 电脑显示器连接的很多都是这种接口 以前的CRT显示器用的也是这种接口 它也称为D Sub 它支持
  • 伯努利分布、二项分布、多项分布、贝塔分布、狄利克雷分布、高斯分布

    文章目录 伯努利分布 二项分布 多项分布 贝塔分布 狄利克雷分布 高斯分布 伯努利分布 伯努利分布 又名两点分布或0 1分布 介绍伯努利分布前首先需要引入伯努利试验 伯努利试验是只有两种可能结果的单次随机试验 即对于一个随机变量X而言 P
  • ggplot2作图之系统发育树

    library ape tree lt read tree text A B C D E F G H I J K L M N O P library ggtree ggtree tree branch length none ladderi
  • BQ40Z50 调试

    一 简介 BQ40Z50 R1的特点与功能 1 这是一颗单芯片解决方案 集成电池 充放电保护 均衡 电量测量三大主要功能 2 支持1 2 3 4节串联锂离子或锂聚合物电池组 二 使用 1 BQ40Z50 R1 评估版一块 2 调试器一个 3
  • 什么是COBOL? COBOL编程说明

    有些技术永不消亡 它们只是逐渐消失在木制品中 向普通软件开发人员询问有关COBOL 面向通用商业语言 的信息 他们会看着您 就像您提到复写纸 含铅汽油或78 RPM记录一样 与Go或Python甚至Pascal或C 之类的现代语言相比 CO
  • winform多文件上传接口服务器,winform向云服务器上传文件

    winform向云服务器上传文件 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器 例如QQ exe 在本地主机和Windows云服务器上分别安装数据传输工具 将文件上传到云服务器
  • C++ tuple元组的基本用法(总结)

    1 元组简介 tuple是一个固定大小的不同类型值的集合 是泛化的std pair 我们也可以把他当做一个通用的结构体来用 不需要创建结构体又获取结构体的特征 在某些情况下可以取代结构体使程序更简洁 直观 std tuple理论上可以有无数