C++17中的结构化绑定详解

C++进阶专栏:http://t.csdnimg.cn/afM80

目录

1.什么是结构化绑定

2.结构化绑定的用法

2.1.对于数组

2.2.对于结构体

2.3.对于std::pair

2.4.对于std::tuple

2.5.对于std::array 

2.6.对于类

2.7.结构化绑定与范围for循环

2.8.与const和引用结合使用

3.结构化绑定的限制和注意事项

4.总结


1.什么是结构化绑定

        C++17引入了结构化绑定(Structured Bindings)功能,它允许以一种更加简洁和直观的方式从复合类型中提取成员变量,并将它们绑定到命名变量上。结构化绑定提供了一种更加方便和灵活的方法来处理元组、结构体、数组等复合类型数据。

        结构化绑定允许我们在一行代码中声明多个变量,并将聚合类型的元素分别初始化为这些变量。这对于处理如std::pair、std::tuple、数组和结构体等类型的数据非常有用。

例如,在使用std::pair时,传统的方法是这样的:

std::pair<int, std::string> person = {11, "222222222"};  
int age = person.first;  
std::string name = person.second;

而使用结构化绑定,我们可以这样写:

auto [age, name] = std::make_pair(37, "44444444");

2.结构化绑定的用法

        结构化绑定的语法非常直观,它使用方括号[]来列出需要绑定的变量名。这些变量将按照它们在方括号中出现的顺序与聚合类型的元素进行匹配。

2.1.对于数组

        假设我们有一个整数数组arr,包含三个元素。我们可以使用结构化绑定轻松地提取出这三个元素,并为它们分别赋予变量名a、b、c:

int arr[] = {11, 22, 33};
auto [a, b, c] = arr;

2.2.对于结构体

        结构化绑定同样适用于结构体。假设我们有一个表示点的结构体Point,包含x和y两个成员变量。我们可以使用结构化绑定来提取这两个成员变量:

struct Point {int x, y;
};
Point p{11, 3442};
auto [x, y] = p;

2.3.对于std::pair

        std::pair是C++标准库中用于存储两个元素的模板类。使用结构化绑定,我们可以轻松地从std::pair中提取出两个元素:

std::pair<int, std::string> p(1, "Hello");
auto [i, s] = p;

2.4.对于std::tuple

        C++11中引入了元组(tuple)类型,用于存储不同类型的数据。使用结构化绑定,我们可以轻松地从元组中提取出各个元素:

std::tuple<int, std::string, double> t(1, "Hello", 2.0);
auto [i, s, d] = t;

2.5.对于std::array 

        std::array是C++11中引入的模板类,用于固定大小的数组。使用结构化绑定,我们可以轻松地从std::array中提取出多个元素:

std::array<int, 3> arr{1, 2, 3};
auto [a, b, c] = arr;

2.6.对于类

        对于类,结构化绑定同样适用。只要类提供了对应的成员变量或成员函数(如begin、end等),我们就可以使用结构化绑定来提取数据:

class MyClass {
public:int a, b;
};
MyClass obj{1, 2};
auto [x, y] = obj;

2.7.结构化绑定与范围for循环

        结构化绑定还可以与范围for循环结合使用,简化对容器元素的处理。假设我们有一个std::vector类型的容器v,我们可以使用结构化绑定在范围for循环中提取每个元素的值:

//[1]
std::vector<int> v{1, 2, 3};
for (auto [i] : v) {std::cout << i << std::endl;
}//[2]
// 使用结构化绑定迭代std::map
std::map<int, std::string> dataMap{{1, "one"}, {2, "two"}};
for (const auto& [key, value] : dataMap) {// 处理每个键值对
}

2.8.与const和引用结合使用

   结构化绑定也支持const和引用修饰符,这对于保护数据和避免不必要的拷贝非常有用。

const auto& [refAge, refName] = person; // refAge和refName是对person中数据的常量引用

3.结构化绑定的限制和注意事项

尽管结构化绑定非常强大,但它也有一些限制和需要注意的地方:

1)结构化绑定不能用于类类型,除非该类提供了相应的结构化绑定支持(通过特化std::get或提供tie成员函数)。

2)绑定的变量必须是可以被初始化的类型,且初始化不会引发歧义。

3)在某些情况下,结构化绑定可能导致不必要的拷贝,特别是在处理大型对象时。因此,在性能敏感的场景下要谨慎使用。

4.总结

        总体而言,结构化绑定是C++17中一个非常有用的特性,它可以让我们的代码更简洁、易读,提高开发效率。通过结构化绑定,我们可以轻松地从数组、元组、结构体、类等多种数据结构中提取元素,并为它们分别赋予变量名。此外,结构化绑定还可以与范围for循环结合使用,简化对容器元素的处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QTextStream的使用、技巧与注意事项

在Qt框架中&#xff0c;QTextStream类是进行文本数据读写操作的重要工具。无论是处理文本文件&#xff0c;还是在内存中操作字符串&#xff0c;QTextStream以其简洁易用的API和强大的功能&#xff0c;极大地简化了文本处理任务。本文将介绍QTextStream的使用方法、一些实用技巧…

【LAMMPS学习】八、基础知识(1.7) LAMMPS 与 MDI 库代码耦合

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

【并发】面试题汇总

并发篇1. 什么是线程和进程?2. 程序计数器为什么是私有的?3. 虚拟机栈和本地方法栈为什么是私有的?4. 如何理解线程安全和不安全&#xff1f;5. 线程的类型6. 如何创建线程&#xff1f;7. 线程的生命周期和状态8. 什么是死锁&#xff0c;死锁产生的条件9. 如何预防和避免线程…

LeetCode 刷题汇总——题目序号顺序版

剑指 Offer——和为 S 的两个数字 剑指 Offer——数字在排序数组中出现的次数 剑指 Offer——和为 S 的连续正数序列 剑指 Offer——最小的 K 个数 剑指 Offer——连续子数组的最大和 剑指 Offer——数组中的逆序对 LeetCode 1——两数之和 LeetCode 2——两数相加 LeetCode 3…

Nacos日志目录下每个日志文件的简要说明

当我们在使用Nacos时&#xff0c;可能会遇到各种问题&#xff0c;需要查看Nacos的日志来进行排查。 下面是对Nacos日志目录下每个日志文件的简要说明&#xff1a; alipay-jraft.log&#xff1a;该日志文件记录Nacos使用的JRaft库的日志。 cmdb-main.log&#xff1a;该日志文件…

【现代C++】委托构造函数

现代C中的委托构造函数&#xff08;Delegating Constructors&#xff09;是C11引入的特性&#xff0c;它允许一个构造函数调用同一个类中的另一个构造函数&#xff0c;以避免代码重复。这种特性在初始化对象时提高了代码的复用性和清晰性。 1. 基本用法 在同一个类中&#xf…

(小红书平台)2024用户画像洞察报告

现今的小红书坐拥3亿月活用户&#xff0c;男女比例达到3:7&#xff0c;95后占比为50%&#xff0c;00后占比为35%&#xff0c;一二线城市用户占比50%。社区分享者超8000万&#xff0c;日均用户搜索渗透达到60%&#xff0c;UGC内容占比达90%。&#xff08;数据来源&#xff1a;小…

[lesson16]类的真正形态

类的真正形态 类的关键字 struct在C语言中以及有了自己的含义&#xff0c;必须继续兼容 在C中提供了新的关键字class用于类的定义 class和struct的用法是完全相同的 在用struct定义类时&#xff0c;所有成员的默认访问级别为public 在用class定义类时&#xff0c;所有成员…

虚拟网络设备的真正使命:实现有控制的通信

在数字化时代&#x1f4f2;&#xff0c;网络安全&#x1f512;成为了企业和个人防御体系中不可或缺的一部分。随着网络攻击的日益复杂和频繁&#x1f525;&#xff0c;传统的物理网络安全措施已经无法满足快速发展的需求。虚拟网络设备&#x1f5a7;&#xff0c;作为网络架构中…

mysql启动时报错:Starting MySQL... ERROR! The server quit without updating PID file快速解决

mysql启动时报错&#xff1a;Starting MySQL… ERROR! The server quit without updating PID file (/opt/mysql/data/mysql.pid) 的解决方法 出现问题的可能性 1、可能是/opt/mysql/data/数据目录mysql用户没有权限&#xff08;修改数据目录的权限&#xff09; 解决方法 &a…

谈谈功率IC巨头—士兰微

大家好&#xff0c;我是砖一。 今天给大家分享一下士兰微电子公司&#xff0c;&#xff0c;有做功率元器件&开关电源和IC的朋友可以了解一下&#xff0c;希望对你有用~ 1 公司介绍 士兰微电子成立于1997年&#xff0c;于2003年上市&#xff0c;总部位于杭州&#xff0c;…

unity按路径移动

using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class FollowPathMove : MonoBehaviour {public Transform[] wayPointArray;[SerializeField] private Transform PathA;//路径点的父物体[SerializeField]private Trans…

【春招面试篇】大厂面试干货分享

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多面经   &#x1f51d;&#x1f51d; 面试经验分享 1. 前言2. 去哪儿投简历?内推是否有用?3. 投递简历前的准备…

7. TypeScript中的Any, Unknown, Void, Never类型

在TypeScript的类型系统中&#xff0c;any、unknown、void、never这四种类型扮演着特殊的角色。它们各自有着不同的用途和行为&#xff0c;理解它们的差异对于编写类型安全的TypeScript代码至关重要。本文将深入探讨这四种类型的特性和使用场景&#xff0c;帮助你更好地利用Typ…

美团一面,面试官让介绍AQS原理并手写一个同步器,直接凉了

写在开头 今天在牛客上看到了一个帖子&#xff0c;一个网友吐槽美团一面上来就让手撕同步器&#xff0c;没整出来&#xff0c;结果面试直接凉凉。 就此联想到一周前写的一篇关于AQS知识点解析的博文&#xff0c;当时也曾埋下伏笔说后面会根据AQS的原理实现一个自定义的同步器…

【MySQL数据库 | 第二十五篇】深入探讨MVCC底层原理

前言&#xff1a; 在当今互联网时代&#xff0c;数据库扮演着数据存储和管理的关键角色。对于大型Web应用程序和企业级系统而言&#xff0c;高效地处理并发访问和事务管理是至关重要的。多版本并发控制&#xff08;MVCC&#xff09;是一种数据库事务处理的技术&#xff0c;旨…

【CV】ORB算法

1. ORB算法&#xff1a; 特点&#xff1a; 实现了旋转不变性、尺度不变性和计算效率高等特性。 旋转不变性&#xff1a; 通过计算关键点周围的梯度信息&#xff0c;确定关键点的主方向。将图像旋转到关键点的主方向&#xff0c;然后再提取BRIEF描述符&#xff0c;增强了旋转不…

【软件测试】个人博客系统测试

个人博客系统测试 一、项目背景1.1 技术背景1.2 功能背景 二、自动化测试2.1 什么是自动化测试2.2 通过使用selenium进行自动化测试的编写&#xff08;Java实现&#xff09;2.3 编写测试用例&#xff0c;执行自动化测试2.3.1 输入用户名:test,密码:123&#xff0c;登录成功2.3.…

CRM集成:解锁业务增长与客户关系管理的关键

预计从2021年至2028年&#xff0c;CRM领域的市场规模将大幅跃升&#xff0c;从约580亿美元增长至1290亿美元。这一显著的增长并非偶然&#xff0c;而是源于CRM平台为企业带来的巨大价值。客户关系管理平台助力销售高效开发潜在客户&#xff0c;客户成功经理有效支持客户&#x…

unable to find a medium containing a live file system解决办法!

背景&#xff1a; 用Ventoy制作U盘系统安装盘&#xff0c;只需要把ISO镜像拷进去就可以&#xff0c;可以放多少个镜像取决于U盘的大小&#xff0c;无需重复制作。Ventoy 将U盘的第一个分区默认格式化为exFAT文件系统来存放ISO文件。 但是&#xff0c;今天鲲鹏920平台安装银河…