C++11新增容器以及元组
上次说了C++11的部分新特性,这里我们来说说新增的容器。
- unordered_map
- unordered_set
- unordered_multimap
- unordered_multiset
- array
- forward_list
- tuple
一、std::array
array
array就是数组,为什么会出现这样一个容器呢,不是有vector和传统数组吗?那你有没有某些时候抱怨过vector速度太慢。array 保存在栈内存中,相比堆内存中的vector,我们就能够灵活的访问元素,获得更高的性能;同时真是由于其堆内存存储的特性,有些时候我们还需要自己负责释放这些资源。
array就是介于传统数组和vector两者之间的容器,封装了一些函数,比传统数组方便,但是又没必要使用vector;
array 会在编译时创建一个固定大小的数组array 不能够被隐式的转换成指针,定义时需要指定类型和大小。支持快速随机访问。不能添加或删除元素。
用法和vector类似。
array<int, > a = {,,};
array<int, > b(a);
sort(a.begin(),a.end());
lower_bound(a.begin(),a.end(),);
值得一提的是当遇上C风格接口可以这样做
void f(int *p, int len) {
return;
}
array<int,> a = {,,,};
// C 风格接口传参
f(&a[], a.size());
f(a.data(), a.size());
forward_list
forward_list 是一个列表容器,使用方法和 list 基本类似。但forward_list 使用单向链表进行实现,提供了 O(1) 复杂度的元素插入,不支持快速随机访问,也是标准库容器中唯一一个不提供 size() 方法的容器。当不需要双向迭代时,具有比 list 更高的空间利用率。
二、unordered_map,unordered_set,unordered_multimap,unordered_multiset
加了个unordered前缀,也是把Hash正式带入了STD中,内部没有红黑树,无法自动排序,只是用Hash建立了映射,其他用法相同,当题目只需要映射而不要排序时候,用这个会快很多。
三、元组Tuple
这个才是我们要说的重头戏,C++11带来了一个新的东西,元组Tuple,可以将任意种类型建立闭包,和pair类似,但pair只能两个类型。
用法
tuple<int,char,int> q(,'a',);
tuple<int,char,int> p(q);
p = make_tuple(,'a',); //需要拿去元组中的某个值时候
//get<>必须用常量
int num1 = get<>(q);
int ch = get<>(q);
int num2 = get<>(q);
//或者直接拆包元组
tie(num1,ch,num2) = q; //元组合并
auto tup = tuple_cat(q,move(p)); // move保证为右值,上篇有说 //求某个元组的长度
int len = tuple_size<decltype(tup)>::value;
cout << len << endl;
那么需要遍历操作怎么办。上面说到get只能用常数,所以不能直接遍历,那么应该如何做呢,标准库做不到,但可以用一个boost的黑科技,但这个库竞赛好像是不支持的,这里就简要提一下。
#include <boost/variant.hpp>
template <size_t n, typename... T>
boost::variant<T...> _tuple_index(size_t i, const std::tuple<T...>& tpl) {
if (i == n)
return std::get<n>(tpl);
else if (n == sizeof...(T) - )
throw std::out_of_range("overflow");
else
return _tuple_index<(n < sizeof...(T)- ? n+ : )>(i, tpl);
}
template <typename... T>
boost::variant<T...> tuple_index(size_t i, const std::tuple<T...>& tpl) {
return _tuple_index<>(i, tpl);
}
这样就可以直接用下面方式遍历了,
for(int i = ; i != tuple_len(tup); ++i)
std::cout << tuple_index(i, tup) << std::endl;
在C++17中,variant已经被列入标准库。tuple虽然方便,但是标准库提供的功能有限,某些功能还是无法实现。就当个pair扩展版用也挺好qwq
C++11新增容器以及元组的更多相关文章
- hive 0.10 0.11新增特性综述
我们的hive版本升迁经历了0.7.1 -> 0.8.1 -> 0.9.0,并且线上shark所依赖的hive版本也停留在0.9.0上,在这些版本上有我们自己的bug fix patch和 ...
- c++11 List 容器
c++11 List 容器 List简介 list是一个双向链表容器 可高效地进行插入删除元素. list不可以随机存取元素,所以不支持at(pos)函数与[]操作符. ...
- Java SE 11 新增特性
Java SE 11 新增特性 作者:Grey 原文地址:Java SE 11 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- 11.python中的元组
在学习什么是元组之前,我们先来看看如何创建一个元组对象: a = ('abc',123) b = tuple(('def',456)) print a print b
- c++11新增的一些便利的算法
c++11新增加了一些便利的算法,这些新增的算法使我们的代码写起来更简洁方便,这里仅仅列举一些常用的新增算法,算是做个总结,更多的新增算法读者可以参考http://en.cppreference.co ...
- c++11——改进容器性能
使用emplace_back就地构造 emplace_back能就地通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好的避免内存的拷贝和移动,使得容器插入元素的性能得到进一步提升. ...
- JAVA编程思想(第四版)学习笔记----11.4 容器的打印
import static java.lang.System.out; import java.util.ArrayList; import java.util.Collection; import ...
- c++11の顺序容器
容器是一种容纳特定类型对象的集合.C++的容器可以分为两类:顺序容器和关联容器.顺序容器的元素排列和元素值大小无关,而是由元素添加到容器中的次序决定的.标准库定义了三种顺序容器的类型:vector ...
- c++11の关联容器
一.关联容器 C++的容器类型可以分为顺序容器和关联容器两大类.对于关联容器,主要有map和set,对于这两种,根据不同的维度,衍生出了8种容器 map ...
随机推荐
- SAP无法激活表问题
因为修改了表结构导致无法激活,刚开始以为是数据库没有调整,然后试着运行SE14,发现还是报错 这个时候就要看看数据库服务器时候正常,输入事务码ST04,查看概览,发现磁盘已满 登录HANA Studi ...
- Day 01--选题与设计(一)
1.第一天我们主要确定了软件课设的项目,做一个学校内食堂订送餐的微信小程序.我们大体的设计思路是:可以实现学生身份的认证,幷使学生们能自行选择校园内的食堂,挑选各个食堂各个窗口菜谱上可以选择的菜,选择 ...
- 帝国CMS(EmpireCMS) v7.5 前台XSS漏洞分析
帝国CMS(EmpireCMS) v7.5 前台XSS漏洞分析 一.漏洞描述 该漏洞是由于javascript获取url的参数,没有经过任何过滤,直接当作a标签和img标签的href属性和src属性输 ...
- JS基础-该如何理解原型、原型链?
JS的原型.原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对 ...
- 自由变形技术(Free-Form Deformation)
自由变形技术Free-Form Deformation是编辑几何模型的重要手段,它于80年代由Sederberg等人提出,目前许多三维建模软件中都有这种变形算法.自由变形方法在变形过程中并不是直接操作 ...
- python学习——字符串
1)字符串解释 字符串是python中常用的数据类型我们可以使用" "或' '来创建字符串. 2)字符串操作 """访问字符串中的值"&qu ...
- Java基础之Iterable与Iterator
Java基础之Iterable与Iterator 一.前言: Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的.able结尾的表示 能...样,可以做.... Iterato ...
- P1357 花园 状压 矩阵快速幂
题意 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(2<=N<=10^15).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻M(2<=M& ...
- hdu 1007 Quoit Design(分治)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007 题意:给出n个点求最短的两点间距离除以2. 题解:简单的分治. 其实分治就和二分很像二分的写df ...
- 深入浅出TypeScript(4)- 使用接口和类型别名
在TypeScript中,为了可以约束对象定义,提供了两个新的特性,接口和类型别名. TypeScript中的接口 在强类型语言中,都有接口的概念,那么TypeScript中的接口是如何使用的呢? 接 ...