跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++17 结构化绑定
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++17结构化绑定 = 结构化绑定(Structured Binding)是C++17引入的一项特性,它允许开发者将数组、元组(tuple)或类似结构的数据类型中的元素直接解包到多个变量中,从而简化代码并提高可读性。结构化绑定在处理复合数据类型时特别有用,例如当需要访问`std::pair`、`std::tuple`或自定义结构体的成员时。 == 基本语法 == 结构化绑定的语法形式如下: <syntaxhighlight lang="cpp"> auto [var1, var2, ..., varN] = expression; </syntaxhighlight> 其中,`expression`可以是数组、元组或具有公开数据成员的结构体。 === 示例1:解包数组 === <syntaxhighlight lang="cpp"> #include <iostream> int main() { int arr[3] = {1, 2, 3}; auto [x, y, z] = arr; // 结构化绑定 std::cout << "x: " << x << ", y: " << y << ", z: " << z << std::endl; return 0; } </syntaxhighlight> '''输出:''' <pre> x: 1, y: 2, z: 3 </pre> === 示例2:解包`std::pair` === <syntaxhighlight lang="cpp"> #include <iostream> #include <utility> int main() { auto pair = std::make_pair(42, "hello"); auto [num, str] = pair; // 结构化绑定 std::cout << "num: " << num << ", str: " << str << std::endl; return 0; } </syntaxhighlight> '''输出:''' <pre> num: 42, str: hello </pre> == 结构化绑定与引用 == 结构化绑定可以与引用结合使用,以直接修改原始数据: <syntaxhighlight lang="cpp"> #include <iostream> #include <utility> int main() { auto pair = std::make_pair(42, "hello"); auto& [num, str] = pair; // 使用引用绑定 num = 100; // 修改原始数据 std::cout << "pair.first: " << pair.first << std::endl; // 输出100 return 0; } </syntaxhighlight> '''输出:''' <pre> pair.first: 100 </pre> == 结构化绑定与自定义结构体 == 结构化绑定也适用于自定义结构体,只要结构体的成员是公开的: <syntaxhighlight lang="cpp"> #include <iostream> struct Point { int x; int y; }; int main() { Point p{10, 20}; auto [coordX, coordY] = p; // 结构化绑定 std::cout << "x: " << coordX << ", y: " << coordY << std::endl; return 0; } </syntaxhighlight> '''输出:''' <pre> x: 10, y: 20 </pre> == 实际应用场景 == 结构化绑定在以下场景中特别有用: 1. '''遍历`std::map`''':可以直接解包键值对。 <syntaxhighlight lang="cpp"> #include <iostream> #include <map> int main() { std::map<int, std::string> myMap = {{1, "one"}, {2, "two"}}; for (const auto& [key, value] : myMap) { // 结构化绑定简化遍历 std::cout << key << ": " << value << std::endl; } return 0; } </syntaxhighlight> '''输出:''' <pre> 1: one 2: two </pre> 2. '''函数返回多个值''':结合`std::tuple`使用,避免定义临时结构体。 <syntaxhighlight lang="cpp"> #include <iostream> #include <tuple> std::tuple<int, std::string, double> getData() { return {42, "answer", 3.14}; } int main() { auto [num, str, pi] = getData(); // 结构化绑定解包返回值 std::cout << num << ", " << str << ", " << pi << std::endl; return 0; } </syntaxhighlight> '''输出:''' <pre> 42, answer, 3.14 </pre> == 结构化绑定的限制 == 1. 结构化绑定不能用于动态分配的数据(如指针指向的数组)。 2. 绑定的变量数量必须与数据结构中的元素数量完全匹配。 3. 结构化绑定不能用于私有成员或非聚合类型。 == 总结 == 结构化绑定是C++17中一项强大的特性,能够显著简化代码并提高可读性。它特别适用于处理复合数据类型,如数组、元组和结构体。通过结合引用,还可以直接修改原始数据。在实际开发中,结构化绑定常用于遍历容器、解包函数返回值等场景。 <mermaid> graph TD A[结构化绑定] --> B[数组] A --> C[std::pair] A --> D[std::tuple] A --> E[自定义结构体] B --> F[直接解包元素] C --> G[解包键值对] D --> H[解包多个返回值] E --> I[解包成员变量] </mermaid> [[Category:编程语言]] [[Category:C++]] [[Category:C++141720 特性]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)