news 2026/5/31 5:13:44

C++17中的结构化绑定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++17中的结构化绑定

C++17中的结构化绑定

C++17 结构化绑定

C++17 引入了结构化绑定(Structured Bindings),它允许我们将一个对象的多个成员或容器的多个元素解构为独立的变量。这种特性可以让代码更加简洁和易读。


使用场景

  1. 解构数组
    • 结构化绑定可以将数组的元素解构为多个变量。
  2. 解构std::pairstd::tuple
    • 结构化绑定可以直接解构std::pairstd::tuple
  3. 解构std::map的键值对
    • 在遍历std::map时,可以直接解构键值对为两个变量。
  4. 解构自定义结构体或类
    • 如果类或结构体有std::tuple_sizestd::get的支持,可以使用结构化绑定解构其成员。
  5. 解构标准容器
    • 适用于std::arraystd::dequestd::list等容器的解构。

代码示例

1. 解构数组
#include<iostream>#include<array>intmain(){std::array<int,3>arr={1,2,3};// 使用结构化绑定解构数组auto[a,b,c]=arr;std::cout<<"a: "<<a<<", b: "<<b<<", c: "<<c<<std::endl;return0;}

输出:

a: 1, b: 2, c: 3

2. 解构std::pair
#include<iostream>#include<utility>intmain(){std::pair<int,std::string>p={1,"Hello"};// 使用结构化绑定解构 pairauto[id,message]=p;std::cout<<"id: "<<id<<", message: "<<message<<std::endl;return0;}

输出:

id: 1, message: Hello

3. 解构std::map的键值对
#include<iostream>#include<map>intmain(){std::map<std::string,int>myMap={{"Alice",25},{"Bob",30},{"Charlie",35}};// 遍历 map 并解构键值对for(constauto&[key,value]:myMap){std::cout<<"Key: "<<key<<", Value: "<<value<<std::endl;}return0;}

输出:

Key: Alice, Value: 25 Key: Bob, Value: 30 Key: Charlie, Value: 35

4. 解构std::tuple
#include<iostream>#include<tuple>intmain(){std::tuple<int,double,std::string>t={42,3.14,"C++17"};// 使用结构化绑定解构 tupleauto[num,pi,lang]=t;std::cout<<"num: "<<num<<", pi: "<<pi<<", lang: "<<lang<<std::endl;return0;}

输出:

num: 42, pi: 3.14, lang: C++17

5. 解构std::deque
#include<iostream>#include<deque>intmain(){std::deque<int>dq={10,20,30};// 解构 deque 的前两个元素auto[first,second]=std::tie(dq[0],dq[1]);std::cout<<"first: "<<first<<", second: "<<second<<std::endl;return0;}

输出:

first: 10, second: 20

6. 解构std::list
#include<iostream>#include<list>intmain(){std::list<int>lst={100,200,300};// 解构 list 的前两个元素autoit=lst.begin();auto[first,second]=std::tie(*it,*(++it));std::cout<<"first: "<<first<<", second: "<<second<<std::endl;return0;}

输出:

first: 100, second: 200

7. 解构自定义结构体
#include<iostream>#include<tuple>structPoint{intx;inty;// 提供 tuple-like 接口intgetX()const{returnx;}intgetY()const{returny;}};namespacestd{template<>structtuple_size<Point>:std::integral_constant<size_t,2>{};template<>structtuple_element<0,Point>{usingtype=int;};template<>structtuple_element<1,Point>{usingtype=int;};intget<0>(constPoint&p){returnp.getX();}intget<1>(constPoint&p){returnp.getY();}}intmain(){Point p={10,20};// 使用结构化绑定解构 Pointauto[x,y]=p;std::cout<<"x: "<<x<<", y: "<<y<<std::endl;return0;}

输出:

x: 10, y: 20

总结

支持结构化绑定的场景
  1. 数组(std::array或 C 风格数组)
  2. std::pairstd::tuple
  3. 标准容器(如std::mapstd::dequestd::list等)
  4. 自定义类或结构体(需要提供std::tuple_sizestd::get的特化)
优点
  • 提高代码可读性。
  • 避免手动解包,减少代码冗余。
  • 更加现代化的写法,符合 C++17 的风格。
注意事项
  • 结构化绑定会创建新的变量,不能直接修改原始对象的值。
  • 对于自定义类或结构体,需要提供std::tuple_sizestd::get的特化支持。

通过这些示例,你可以在 C++17 中灵活使用结构化绑定来简化代码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 2:42:36

XCOM 2模组管理革新:AML启动器全方位配置指南

XCOM 2模组管理革新&#xff1a;AML启动器全方位配置指南 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-…

作者头像 李华
网站建设 2026/5/30 17:21:46

风扇控制终极优化指南:从噪音困扰到散热效能的完全掌握

风扇控制终极优化指南&#xff1a;从噪音困扰到散热效能的完全掌握 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…

作者头像 李华
网站建设 2026/5/27 7:47:46

如何用MobaXterm提升终端工作效率:5个高效技巧

如何用MobaXterm提升终端工作效率&#xff1a;5个高效技巧 【免费下载链接】MobaXterm-Keygen MobaXterm Keygen Originally by DoubleLabyrinth 项目地址: https://gitcode.com/gh_mirrors/mob/MobaXterm-Keygen MobaXterm作为一款集成终端工具&#xff0c;融合了SSH客…

作者头像 李华
网站建设 2026/5/29 17:30:25

XCOM 2模组管理终极解决方案:AML启动器全方位应用指南

XCOM 2模组管理终极解决方案&#xff1a;AML启动器全方位应用指南 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/x…

作者头像 李华