欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > C++ 语言特性19 - 结构化绑定

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

2024/10/26 17:20:53 来源:https://blog.csdn.net/zg260/article/details/142707042  浏览:    关键词: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;}
}

 

 

 

 

 

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com