当前位置: 首页 > news >正文

C加加中的结构化绑定(解包,折叠展开)

在C++17中,结构化绑定(Structured Binding)确实是一种非常有用的特性,它简化了从复合数据类型中提取多个成员的操作。以下是一些使用结构化绑定的示例,涵盖了元组(tuple)、对(pair)、结构体(struct)和类(class)的情况。

示例 1:元组(tuple)

#include <iostream>  
#include <tuple>  
#include <string>  int main() {  std::tuple<int, std::string, double> person = {1, "Alice", 5.5};  // 使用结构化绑定  auto [id, name, height] = person;  std::cout << "ID: " << id << "\n";  std::cout << "Name: " << name << "\n";  std::cout << "Height: " << height << "\n";  return 0;  
}

示例 2:对(pair)

#include <iostream>  
#include <utility> // 包含 std::pair  int main() {  std::pair<int, std::string> p = {42, "Answer"};  // 使用结构化绑定  auto [number, description] = p;  std::cout << "Number: " << number << "\n";  std::cout << "Description: " << description << "\n";  return 0;  
}

示例 3:结构体(struct)

#include <iostream>  struct Point {  int x;  int y;  
};  int main() {  Point p = {3, 4};  // 使用结构化绑定  auto [x, y] = p;  std::cout << "X: " << x << "\n";  std::cout << "Y: " << y << "\n";  return 0;  
}

示例 4:类(class)

#include <iostream>  class Rectangle {  
public:  int width;  int height;  
};  int main() {  Rectangle rect = {10, 20};  // 使用结构化绑定  auto [width, height] = rect;  std::cout << "Width: " << width << "\n";  std::cout << "Height: " << height << "\n";  return 0;  
}

注意事项
可绑定性:结构化绑定要求被绑定的复合数据类型必须满足一定的条件,比如具有可解构性(destructurable)。具体来说,类型需要满足以下条件之一:

std::tuple 或 std::pair。
结构体或类,其成员是公开的且是非静态的。
数组(数组的元素会被绑定到新的变量中)。

引用绑定:如果希望绑定的是引用而不是值的拷贝,可以使用 auto&:

auto& [ref_x, ref_y] = p;

忽略某些成员:如果不需要绑定某个成员,可以使用 std::ignore 或直接省略变量名(C++20起):

auto [_, name] = person; // 忽略第一个成员

结构化绑定提供了一种更加简洁和直观的方式来处理复合数据类型,使代码更加清晰和易于维护。

在C++17中,结构化绑定(Structured Binding)是一种新的语法特性,它允许我们从元组、对(pair)、结构体(struct)或类(class)中提取多个成员,并将它们分别赋值给新的变量。这个特性提供了一种更简洁和直观的方式来处理复合数据类型,而不需要显式地访问每个成员。
基本语法结构化绑定的基本语法如下:auto [var1, var2, …] = expression;其中, var1, var2, … 是新变量的名称, expression 是返回元组、对、结构体或类的表达式。示例1. 从 std::pair 中提取值:#include #include int main() { std::pair<int, double> p = {1, 2.5}; auto [x, y] = p; // x = 1, y = 2.5 std::cout << "x = " << x << ", y = " << y << std::endl; return 0;}2. 从 std::tuple 中提取值:#include #include int main() { std::tuple<int, double, char> t = {1, 2.5, ‘a’}; auto [x, y, z] = t; // x = 1, y = 2.5, z = ‘a’ std::cout << "x = " << x << ", y = " << y << ", z = " << z << std::endl; return 0;}3. 从结构体中提取成员:#include struct Point { int x; double y;};int main() { Point p = {1, 2.5}; auto [x, y] = p; // x = 1, y = 2.5 std::cout << "x = " << x << ", y = " << y << std::endl; return 0;}注意事项结构化绑定使用的是 auto 关键字,这意味着变量的类型将由编译器自动推断。如果你想要显式指定变量的类型,可以使用 auto& 或 auto&& 来创建引用或右值引用。结构化绑定可以用于初始化列表、函数参数、函数返回值等场景。如果你只对元组、对、结构体或类中的某些成员感兴趣,可以使用下划线( _ )忽略不需要的成员。auto [x, _, z] = t; // 忽略第二个成员结构化绑定是C++17中一个非常实用的功能,

在C++中,结构化绑定(Structured Binding)是一种特性,它允许我们从元组、对(pair)、结构体(struct)或类(class)等复合类型的实例中提取多个成员,并将它们分别绑定到新的变量上。这个特性是在C++17标准中引入的。
结构化绑定的基本用法对于元组、对或结构体/类,结构化绑定的语法如下:auto [a, b] = std::pair<int, double>(1, 2.0);// 或者对于结构体struct Point { int x, y; };auto [x, y] = Point{1, 2};在上面的例子中, a 和 b 是从 std::pair 中提取的两个成员, x 和 y 是从 Point 结构体中提取的两个成员。对数组进行结构化绑定对于数组,结构化绑定也是可行的,但是需要数组的元素数量和结构化绑定中声明的变量数量相匹配。这是因为数组在结构化绑定中被视为一个复合类型,其元素可以被逐一解包。下面是一个例子:int arr[] = {1, 2, 3};auto [first, second, third] = arr;// first = 1, second = 2, third = 3在这个例子中,我们创建了一个包含三个整数的数组 arr ,然后使用结构化绑定将数组的每个元素分别绑定到 first 、 second 和 third 这三个变量上。注意事项数组的结构化绑定只能用于固定大小的数组,不能用于动态分配的数组(如 std::vector 或者在堆上分配的数组)。结构化绑定中的变量数量必须与数组中的元素数量完全匹配,否则编译器会报错。结构化绑定不会复制数组的内容,它只是创建了数组元素的引用或者值的拷贝,具体取决于数组的类型(值类型或引用类型)。结构化绑定提供了一种简洁和直观的方式来处理复合类型的解构,使得代码更加清晰易读。


http://www.mrgr.cn/news/68359.html

相关文章:

  • 小张求职记六
  • 处理 omitted for duplicate 灰色
  • 易泊车牌识别相机:智能与精准的完美结合
  • P5665 [CSP-S2019] 划分
  • 牛客练习赛131(dp,dfs,bfs,线段树维护等差数列)
  • 【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十二章 Debian文件系统
  • 国标GB28181公网直播EasyGBS国标GB28181设备管理软件支持的监控设备类型
  • 【C++】哈希表封装 unordered_map 和 unordered_set 的实现过程
  • 如何通过执行计划分析优化SQL查询性能——以`TrainOrderChange`表查询为例
  • UE5.4 PCG 复制关卡实例
  • go中的类型断言详解
  • 动态规划28:376. 摆动序列
  • 【EdgeBox-8120AI-TX2】Ubuntu18.04 + ROS_ Melodic + HP60C上手体验
  • Linux系统的文件系统和日志和管理
  • 绿光激光头定制在各行业的应用优势
  • Java[面试题]-真实面试
  • 3235. 判断矩形的两个角落是否可达
  • 安装和卸载Mysql(压缩版)
  • Java——》try-with-resource
  • anaconda 安装笔记Ubuntu20
  • 强大又好用 这些AI工具让效率提升10倍
  • 【TS】九天学会TS语法——5.TypeScript的类
  • 气膜球幕:打造引人注目的展览新选择—轻空间
  • InsectaIntel 智能昆虫识别平台
  • 无人机影像处理系统技术选型
  • 【数据集】【YOLO】【目标检测】摔跤识别数据集 5097 张,YOLO行人摔倒识别算法实战训练教程!