news 2026/4/16 14:03:59

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/4/3 6:29:00

PlotSquared土地管理进阶指南:从问题到解决方案

PlotSquared土地管理进阶指南&#xff1a;从问题到解决方案 【免费下载链接】PlotSquared PlotSquared - Reinventing the plotworld 项目地址: https://gitcode.com/gh_mirrors/pl/PlotSquared 诊断权限冲突&#xff1a;3步定位法 当玩家反馈"无法建造"或&q…

作者头像 李华
网站建设 2026/4/3 3:33:34

3步解锁Masa模组全中文:技术玩家的无障碍使用指南

3步解锁Masa模组全中文&#xff1a;技术玩家的无障碍使用指南 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 作为Minecraft技术玩家&#xff0c;你是否也曾因Masa模组的英文界面而头疼…

作者头像 李华
网站建设 2026/3/23 5:41:33

3个突破点打造随身游戏中枢:Playnite便携版终极配置指南

3个突破点打造随身游戏中枢&#xff1a;Playnite便携版终极配置指南 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址: h…

作者头像 李华
网站建设 2026/4/13 21:09:40

Weasis:专业级开源医学影像查看器全面解析

Weasis&#xff1a;专业级开源医学影像查看器全面解析 【免费下载链接】Weasis Weasis is a DICOM viewer available as a desktop application or as a web-based application. 项目地址: https://gitcode.com/gh_mirrors/we/Weasis Weasis是一款功能强大的开源医学影像…

作者头像 李华
网站建设 2026/4/16 14:03:04

Pyfa舰船配置神器:从零开始打造你的EVE战术优势

Pyfa舰船配置神器&#xff1a;从零开始打造你的EVE战术优势 【免费下载链接】Pyfa Python fitting assistant, cross-platform fitting tool for EVE Online 项目地址: https://gitcode.com/gh_mirrors/py/Pyfa 作为EVE Online新手&#xff0c;你是否曾因错误的舰船配置…

作者头像 李华
网站建设 2026/3/30 18:04:41

AI视觉交互工具本地化部署实践指南

AI视觉交互工具本地化部署实践指南 【免费下载链接】UI-TARS-desktop A GUI Agent application based on UI-TARS(Vision-Lanuage Model) that allows you to control your computer using natural language. 项目地址: https://gitcode.com/GitHub_Trending/ui/UI-TARS-desk…

作者头像 李华