没有合适的资源?快使用搜索试试~ 我知道了~
C++17结构化绑定的实现
0 下载量 140 浏览量
2020-12-17
18:43:31
上传
评论
收藏 97KB PDF 举报
温馨提示
试读
5页
动机 std::map<K>的insert方法返回std::pair<iterator>,两个元素分别是指向所插入键值对的迭代器与指示是否新插入元素的布尔值,而std::map<K>::iterator解引用又得到键值对std::pair<const>。在一个涉及std::map的算法中,有可能出现大量的first和second,让人不知所措。 #include <iostream> #include <map> int main() { typedef std::map<int> Map; Map map; std::pair<Ma
资源详情
资源评论
资源推荐
C++17结构化绑定的实现结构化绑定的实现
动机动机
std::map<K, V>的insert方法返回std::pair<iterator, bool>,两个元素分别是指向所插入键值对的迭代器与指示是否新插入元素
的布尔值,而std::map<K, V>::iterator解引用又得到键值对std::pair<const K, V>。在一个涉及std::map的算法中,有可能出现
大量的first和second,让人不知所措。
#include <iostream>
#include <map>
int main()
{
typedef std::map<int, int> Map;
Map map;
std::pair<Map::iterator, bool> result = map.insert(Map::value_type(1, 2));
if (result.second)
std::cout << "inserted successfully" << std::endl;
for (Map::iterator iter = map.begin(); iter != map.end(); ++iter)
std::cout << "[" << iter->first << ", " << iter->second << "]" << std::endl;
}
C++11标准库添加了std::tie,用若干引用构造出一个std::tuple,对它赋以std::tuple对象可以给其中的引用一一赋值(二元
std::tuple可以由std::pair构造或赋值)。std::ignore是一个占位符,所在位置的赋值被忽略。
#include <iostream>
#include <map>
#include <utility>
int main()
{
std::map<int, int> map;
bool inserted;
std::tie(std::ignore, inserted) = map.insert({1, 2});
if (inserted)
std::cout << "inserted successfully" << std::endl;
for (auto&& kv : map)
std::cout << "[" << kv.first << ", " << kv.second << "]" << std::endl;
}
但是这种方法仍远不完美,因为:
变量必须事先单独声明,其类型都需显式表示,无法自动推导;
对于默认构造函数执行零初始化的类型,零初始化的过程是多余的;
也许根本没有可用的默认构造函数,如std::ofstream。
为此,C++17引入了结构化绑定(structured binding)。
#include <iostream>
#include <map>
int main()
{
std::map<int, int> map;
auto&& [iter, inserted] = map.insert({1, 2});
if (inserted)
std::cout << "inserted successfully" << std::endl;
for (auto&& [key, value] : map)
std::cout << "[" << key << ", " << value << "]" << std::endl;
}
结构化绑定这一语言特性在提议的阶段曾被称为分解声明(decomposition declaration),后来又被改回结构化绑定。这个名
字想强调的是,结构化绑定的意义重在绑定而非声明。
语法语法
结构化绑定有三种语法:
weixin_38704922
- 粉丝: 6
- 资源: 919
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0