news 2026/9/3 4:44:03

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/9/2 2:08:25

NewTab-Redirect专业指南:系统性解决Chrome新标签页定制难题

NewTab-Redirect专业指南&#xff1a;系统性解决Chrome新标签页定制难题 【免费下载链接】NewTab-Redirect NewTab Redirect! is an extension for Google Chrome which allows the user to replace the page displayed when creating a new tab. 项目地址: https://gitcode.…

作者头像 李华
网站建设 2026/9/2 22:42:33

字体设计的范式转移:得意黑Smiley Sans的视觉革命与行业启示

字体设计的范式转移&#xff1a;得意黑Smiley Sans的视觉革命与行业启示 【免费下载链接】smiley-sans 得意黑 Smiley Sans&#xff1a;一款在人文观感和几何特征中寻找平衡的中文黑体 项目地址: https://gitcode.com/gh_mirrors/smi/smiley-sans 当我们谈论字体革命时&…

作者头像 李华
网站建设 2026/9/2 21:55:54

开源数据恢复工具技术指南:从故障诊断到企业级解决方案

开源数据恢复工具技术指南&#xff1a;从故障诊断到企业级解决方案 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 数据损坏问题的系统诊断方法 在数字化时代&…

作者头像 李华
网站建设 2026/9/3 1:19:43

如何让你的漫画收藏在电子设备上重获新生?

如何让你的漫画收藏在电子设备上重获新生&#xff1f; 【免费下载链接】kcc KCC (a.k.a. Kindle Comic Converter) is a comic and manga converter for ebook readers. 项目地址: https://gitcode.com/gh_mirrors/kc/kcc 你是否曾为漫画收藏的沉重而烦恼&#xff1f;是…

作者头像 李华