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

C++ 语言特性19 - 结构化绑定

一:概述

        C++17 引入了结构化绑定(Structured Bindings),这是一个非常实用的语法特性,它允许我们将一个对象(通常是一个复合类型,如数组、元组、pair、结构体等)解构为多个变量,从而更加方便地访问其内部成员。结构化绑定使代码更加简洁和可读,尤其是在处理多返回值函数或复杂数据结构时。

//结构化绑定使用 auto 或显式的类型声明来声明多个变量,同时绑定到对象的各个部分。其基本语法如下auto [var1, var2, var3] = expression;//var1, var2, var3:分别是表达式 expression 中各部分的绑定变量。
//expression:可以是返回多个值的对象,如元组、结构体、数组等。

二:例子

  • 解构 std::pairstd::tuple: 结构化绑定最常见的应用是对 std::pairstd::tuple 进行解构。
#include <iostream>
#include <utility>int main() {std::pair<int, double> p = {1, 3.14};auto [x, y] = p;  // 将 pair 解构为 x 和 ystd::cout << "x = " << x << ", y = " << y << std::endl;  // 输出: x = 1, y = 3.14
}
#include <iostream>
#include <tuple>int main() {std::tuple<int, double, std::string> t = {1, 3.14, "Hello"};auto [i, d, s] = t;  // 解构 tuplestd::cout << "i = " << i << ", d = " << d << ", s = " << s << std::endl;  // 输出: i = 1, d = 3.14, s = Hello
}
  •  函数返回多个值的解构: 结构化绑定可以非常方便地处理返回多个值的函数,例如返回 std::tuplestd::pair 的函数。
#include <iostream>
#include <tuple>std::tuple<int, double> getValues() {return {10, 2.71};
}int main() {auto [a, b] = getValues();  // 解构函数返回的 tuplestd::cout << "a = " << a << ", b = " << b << std::endl;  // 输出: a = 10, b = 2.71
}
  • 解构结构体或类: 结构化绑定也可以用于解构结构体,前提是它们的成员是公共的,并且没有定义自定义的析构函数。 
#include <iostream>struct Point {int x;int y;
};int main() {Point p = {10, 20};auto [x, y] = p;  // 解构 Point 结构体std::cout << "x = " << x << ", y = " << y << std::endl;  // 输出: x = 10, y = 20
}
  • 解构静态数组: 结构化绑定可以用来解构固定大小的数组,将数组的每个元素绑定到相应的变量。
#include <iostream>int main() {int arr[] = {1, 2, 3};auto [a, b, c] = arr;  // 将数组解构为 a, b, cstd::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;  // 输出: a = 1, b = 2, c = 3
}
  • 遍历 std::map 等容器: 使用结构化绑定可以简化 std::map 或其他容器的遍历,使得代码更加简洁。 
#include <iostream>
#include <map>int main() {std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}, {3, "three"}};for (const auto& [key, value] : myMap) {std::cout << key << ": " << value << std::endl;}
}
  • 与范围 for 循环结合使用: 结构化绑定可以与 C++17 的范围 for 循环结合使用,用于遍历容器中的复合类型(如 std::pairstd::tuple)。 
#include <iostream>
#include <vector>
#include <tuple>int main() {std::vector<std::tuple<int, double>> vec = {{1, 2.3}, {4, 5.6}, {7, 8.9}};for (auto& [x, y] : vec) {std::cout << "x = " << x << ", y = " << y << std::endl;}
}

 

 

 

 

 

 


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

相关文章:

  • Python(八)-异常
  • Mac ToDesk 无法连接网络
  • 某项目实战分析代码二
  • centos 7.9系统redis6.2.6哨兵模式部署
  • Ubuntu——双系统Ubuntu22.04系统安装和基础配置
  • JVM学习笔记
  • 每日一练:地下城游戏
  • 从零开始搭建UVM平台(九)-加入reference model
  • 将视频改成代码滚动
  • 最适合养老的Win 10 LTSC 2019精简版,老爷机的福音
  • C++ 语言特性20 - noexcept 关键字
  • python 实现djb2哈希算法
  • 8-2.Android 任务之 CountDownTimer 编码模板(开启计时器、取消计时器)
  • 【计算机网络】详解UDP协议格式特点缓冲区
  • 使用 Wireshark 抓取类似的 HTTP 请求包
  • 读书笔记_《组织行为学》
  • 8c语言基础文件
  • 补码加/减运算的具体示例
  • 《重生到现代之从零开始的C语言生活》—— 结构体和位段
  • python字典为什么至少需要哈希表的三分之一的行留空