C++17尝鲜:结构化绑定声明(Structured Binding Declaration)
结构化绑定声明
结构化绑定声明,是指在一次声明中同时引入多个变量,同时绑定初始化表达式的各个子对象的语法形式。
结构化绑定声明使用auto来声明多个变量,所有变量都必须用中括号括起来。
cv-auto+引用 [变量1, 变量2, ... 变量n ] = 初始化表达式;
cv-auto+引用 [变量1, 变量2, ... 变量n ] (初始化表达式);
cv-auto+引用 [变量1, 变量2, ... 变量n ] {初始化表达式};
// 这里 cv-auto+引用 包含 auto, auto const, auto &, auto&& 等等形式
结构化绑定所声明的变量有两种形式:
- 非引用变量,此时初始化表达式对象需要拷贝一份,变量所绑定的是初始化表达式对象拷贝的各个子对象。
- 引用变量,此时初始化表达式对象不需要拷贝,变量所绑定的是初始化表达式对象本身的各个子对象。
结构化绑定中的初始化表达式有三种类型:
- 数组类型,此时变量所绑定的是数组的各个元素。
pair
tuple
等支持tuple_size<E>
的类型,此时变量所绑定的是get<0>(e),get<1>(e),get<2>(e)
...
这里E是指类型,e是指对象。- 带有 public 成员的结构类型,此时变量所绑定的是结构对象的各个 public 成员。
C++17代码
#include <iostream>
#include <utility>
#include <set>
#include <map>
using namespace std;
struct S {
int a, b, c;
};
map<string, int> get_map()
{
return {
{ "hello", 1 },
{ "world", 2 },
{ "it's", 3 },
{ "me", 4 },
};
}
int main()
{
auto [a, b] = pair(2, "3"s);
cout << a << b << endl; // 23
set<string> myset;
if (auto [iter, success] = myset.insert("Hello"); success)
cout << *iter << endl; // Hello
int arr[] = {1, 2, 3, 4};
const auto& [m1, m2, m3, m4] = arr;
cout << m1 << m2 << m3 << m4 << endl; //1234
S s = {4, 5, 6};
auto& [x, y, z] = s;
x = 0, y = 1, z = 2;
cout << s.a << s.b << s.c << endl; // 012
for (auto&& [k, v] : get_map())
cout << "k=" << k << " v=" << v << endl;
// k=hello v=1
// k=it's v=3
// k=me v=4
// k=world v=2
}
代码说明
- 代码第24行采用结构化绑定声明了 int 类型的 a 和 string 类型的 b,分别绑定了初始化表达式中 pair 对象的 first 和 second。
- 代码第28行采用结构化绑定声明了迭代类型的 iter 和 bool 类型的 success,分别绑定了初始化表达式中 pair 对象的 first 和 second。
- 代码第32行采用结构化绑定声明了 const int& 类型的 m1 ~ m4,分别绑定了初始化表达式中 arr 数组的4个元素。
- 代码第36行采用结构化绑定声明了 int& 类型的 x y z,分别绑定了初始化表达式中 s 对象的3个数据成员 a b c。
- 代码第40行采用结构化绑定声明了 string&& 类型的 k 和 int 类型的 v,分别绑定了初始化表达式中 pair 对象的 first 和 second。
C++14等价代码
#include <iostream>
#include <utility>
#include <set>
#include <map>
using namespace std;
struct S {
int a, b, c;
};
map<string, int> get_map()
{
return {
{ "hello", 1 },
{ "world", 2 },
{ "it's", 3 },
{ "me", 4 },
};
}
int main()
{
auto kv = make_pair(2, "3"s);
auto& a = kv.first; auto& b = kv.second;
cout << a << b << endl; // 23
set<string> myset;
set<string>::iterator iter;
bool success;
tie(iter, success) = myset.insert("Hello");
if (success)
cout << *iter << endl; // Hello
int arr[] = {1, 2, 3, 4};
const auto &m1 = arr[0], &m2 = arr[1], &m3 = arr[2], &m4 = arr[3];
cout << m1 << m2 << m3 << m4 << endl; //1234
S s = {4, 5, 6};
auto &x = s.a, &y = s.b, &z = s.c;
x = 0, y = 1, z = 2;
cout << s.a << s.b << s.c << endl; // 012
for (auto&& kv : get_map()) {
auto&& k = forward<decltype(kv.first)>(kv.first);
auto&& v = forward<decltype(kv.second)>(kv.second);
cout << "k=" << k << " v=" << v << endl;
}
// k=hello v=1
// k=it's v=3
// k=me v=4
// k=world v=2
}
C++17尝鲜:结构化绑定声明(Structured Binding Declaration)的更多相关文章
- C++17结构化绑定
动机 std::map<K, V>的insert方法返回std::pair<iterator, bool>,两个元素分别是指向所插入键值对的迭代器与指示是否新插入元素的布尔值, ...
- C++17尝鲜
https://cloud.tencent.com/developer/article/1351910 [译]C++17,optional, any, 和 variant 的更多细节 用户261520 ...
- C++17尝鲜:在 if 和 switch 语句中进行初始化
初始化语句 在C++17中,类似于 for 语句,在 if 和 switch 语句的判断条件之前也能加上初始化语句,语法形式如下: if (初始化语句; 条件) 语句 else 语句 switch ( ...
- 对结构化学习(structured learning)的理解
接触深度学习以来一直接触的概念都是回归,分类,偶尔接触到结构化学习的概念,似懂非懂的糊弄过去,实在是不负责的表现 翻阅维基百科https://en.wikipedia.org/wiki/Structu ...
- 结构化数据(structured),半结构化数据(semi-structured),非结构化数据(unstructured)
概念 结构化数据:即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据. 半结构化数据:介于完全结构化数据(如关系型数据库.面向对象数据库中的数据)和完全无结构的数据(如声音.图像文件等)之 ...
- 结构化学习(Structured Learning)
本博客是针对李宏毅教授在youtube上上传的Machine Learning课程视频的学习笔记.课程链接 目录 引入 线性模型 结构化SVM 给序列贴标签 引入 我们之前学习到的学习模型的输入与输出 ...
- C++17尝鲜:变长 using 声明
using 声明 先来看 using 声明在类中的应用: 代码1 #include <iostream> using namespace std; struct A { void f(in ...
- C++17尝鲜:variant
variant variant 是 C++17 所提供的变体类型.variant<X, Y, Z> 是可存放 X, Y, Z 这三种类型数据的变体类型. 与C语言中传统的 union 类型 ...
- C++17尝鲜:编译期 if 语句
Constexpr If(编译期 if 语句) 以 if constexpr 打头的 if 语句被称为 Constexpr If. Constexpr If 是C++17所引入的新的语法特性.它为C+ ...
随机推荐
- 关于postman中表单提交与数据包提交的问题,file_get_contents("php://input")可以获取数据,$_POST不能获取数据
Coentent-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下,PHP才会将http请求数据包中相应的数据填入 ...
- Android应用启动会白屏一下的解决办法
设置透明样式,如下:<activity android:name="com.hongfans.cvi.ui.MainActivity" android:configChang ...
- T-SQL 局部变量和全局变量
局部变量 use StudentManageDB go --声明学号变量 ) --查询李铭的信息 set @stuname='李铭' select StudentId,StudentName,Gend ...
- route
route 添加/删除一条到192.168.3.0/24的路由,网关为192.168.1.254? route add/del -net 192.168.3.0 netmask 255.255. ...
- TensorFlow安装教程(ubuntu 18.04)
此教程的硬件条件: 1.Nvidia GPU Geforce390及以上 2.Ubuntu 18.04操作系统 3.Anaconda工具包 如果python版本为3.7及以上,使用如下命令降级到3.6 ...
- 由于ip改变重新配置CM集群
修改所有主机/etc/hosts 修改所有agent节点的/opt/cm-5.5.1/etc/cloudera-scm-agent/config.ini,中server的ip 主节点启动cm serv ...
- MPEG-1视屏压缩标准
MPEG-1标准包括5个部分 图像的四种类型: I帧: B帧:双向帧间预测 P帧: D帧:只含有16分量,为快放设计 压缩前需要帧重排 视屏码流结构 I帧压缩 p帧压缩 b帧压缩 其他压缩算法 MPE ...
- Html——拖放
设置元素为可拖放 首先,为了使元素可拖动,把 draggable 属性设置为 true : <img draggable="true" /> 拖动什么 - ondrag ...
- js之DOM
DOM对象 什么是HTML DOM HTML Document Object Model(文档对象模型) HTML DOM 定义了访问和操作HTML文档的标准方法 HTML DOM 把 HTML ...
- 常用正则表达式—邮箱(Email)
本文针对有一点正则基础的同学,如果你对正则一无所知,请移步“正则表达式30分钟入门教程”学习. 要验证一个字符串是否为邮箱的话,首先要了解邮箱账号的格式.我尝试过在网上找出一个标准的格式,但是很遗憾 ...