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&& 等等形式
结构化绑定所声明的变量有两种形式:
- 非引用变量,此时初始化表达式对象需要拷贝一份,变量所绑定的是初始化表达式对象拷贝的各个子对象。
- 引用变量,此时初始化表达式对象不需要拷贝,变量所绑定的是初始化表达式对象本身的各个子对象。
结构化绑定中的初始化表达式有三种类型:
- 数组类型,此时变量所绑定的是数组的各个元素。
pairtuple等支持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+ ...
随机推荐
- struts2的result的类型配置简介
一.在strut2的action处理完成后,就应该向用户返回结果信息result 根据以下代码作为实例分析: <package name="Hello" extends=&q ...
- mobx.js 使用教程-react
1.store: import { observer } from "mobx-react"; import { observable, action, computed ,aut ...
- 通过表达式树把datareader和datatable转换为实体
续上两篇文章,使用emit构造dynamic method,把 datareader转换为实体,以避免直接使用反射来实现带来的性能损失.代码看似没有纰漏,但是实际上我在framwork4下运行时,调用 ...
- 用vlan实现同一网段的的各部门之间有的可以通信有的不可以通信
日前老师上课演示一个项目:实现公司同一网段的各个部门之间有的可以通信有的无法通信.我们用的是思科测试软件模拟操作,个人觉得很好用. 在刚开始做这个项目的时候我以为端口是对应的,如图,交换机 ...
- lunix 项目部署 *****
linux基本管理命令 服务器上安装服务,python3.6(宿主机上的物理解释器)1.虚拟解释器virtualenv虚拟出多个干净.隔离的python解释器环境问题:管理上较为麻烦,需要找到venv ...
- 《图像处理实例》 之 Voronoi 图
Voronoi 图的设计 以下的改进是http://www.imagepy.org/的作者原创,我只是对其理解之后改进和说明,欢迎大家使用这个小软件! 如有朋友需要源工程,请在评论处留邮箱! 说明:类 ...
- shell 的有用函数
1.isNumber 2.命令可用 3.当前用户是root 1.isNumber 判断“字符串”是否是个数字: declare chkNumber= isNumber(){ parameter1=$ ...
- 导航栏 ------ z-index
z-index 显示的层叠关系,数字越大越在上面 <!DOCTYPE html> <html lang="en"> <head> <met ...
- Failed to execute request because the App-Domain could not be created. Error: 0x80070002 系统找不到指定的文件。
360更新补丁后,网站就打不开aspx文件了,后来一查是framework2.0的KB2844285这个补丁引起的.把它卸载掉就ok了!
- Mac技巧之苹果电脑Mac OS X系统自带的鼠标所在点颜色RGB值查看工具:数码测色计
转自http://www.mac52ipod.cn/post/show-mouse-point-rgb-color-by-apple-mac-os-x-tool.php