C++20结构化绑定探究

结构化绑定是C++中提高代码可读性和效率的一种特性,允许将值直接赋给多个变量。它可以用于pair、tuple、array、struct以及STL数组对象。通过auto关键字和方括号内的变量名,结构化绑定能自动推断并分配值。此外,结合引用使用,还能直接修改绑定容器中的值,避免数据复制。在函数返回类型中使用结构化绑定可以使代码更清晰易懂。
摘要由CSDN通过智能技术生成

结构化绑定产生的原因

结构化绑定可以很容易的将值压缩到单独变量中,从而提高代码的可读性。

使用结构化绑定,可以直接将成员值分配给变量。

thing_pair<int,int>{47,9};
auto [this,that]=thing_pair;
cout<<format("{} {}\n",this,that);

输出为:

47 9

结构化绑定的使用

  1. 结构化绑定适用pair,tuple,array,array和struct。下面例子用了C数组:

int nums [] {1,2,3,4,5};
auto [a,b,c,d,e]=nums;
cout<<format("{} {} {} {} {}\n",a,b,c,d,e);

输出为:

1 2 3 4 5

结构化类型绑定使用自动类型推断,所以类型必须是auto。各个变量的名称都在方括号内[a,b,c,d,e]。在这个例子中,int型c数组nums包含五个值。使用结构化绑定将这五个值赋给变量(a,b,c,d,e);

  1. 这也适用于STL数组对象

array<int,5>nums{1,2,3,4,5};
auto [a,b,c,d,e]=nums;
cout<<format("{} {} {} {} {}\n",a,b,c,d,e);

输出为:

1 2 3 4 5
  1. 或者将它与tuple一起使用

tuple<int,double,string>nums{1,2.7,"three"};
auto [a,b,c]=nums;
cout<<format("{} {} {}\n",a,b,c);

输出为:

1 2.7 three
  1. 将它与结构体一起使用,按照定义的顺序接受变量

struct Things{int i{};double d{};string s{};};
Things nums{1,2.7,"three"};
auto [a,b,c]=nums;
cout<<format("{} {} {}\n",a,b,c);

输出为:

1 2.7 three
  1. 可以使用带有结构化绑定的引用,可以修改绑定容器中的值,同时避免数据复制:

array<int,5>nums{1,2,3,4,5};
auto& [a,b,c,d,e]=nums;
cout<<format("{} {}\n",nums[2],c);
c=47;
cout<<format("{} {}\n",nums[2],c);

输出为:

3 3
47 47

一些注意事项

1.因为结构化绑定使用auto类型推断,所以不能为绑定指定类型,必须使用auto。若使用类型进行绑定,会得到相应的错误信息。

2.对于函数的返回类型,通常使用结构化绑定:

struct div_result{
  long quo;
  long rem;
}

div_result int_div(const long&num,const long&denom){
     struct div_result r{};
     r.quo=num/denom;
     r.rem=num%denom;
     return r;
}

int main(){
     auto [quo,rem]=int_div(47,5);
     cout<<format("quotitent: {}, remainder: {}\n",quo,rem);
}

输出为:

quotient: 9, remainder: 2

用结构化绑定来解包结构可以使代码更清晰,更容易维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Reol520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值