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 ...
随机推荐
- G-P-M 模型
G-P-M 模型概述 每一个OS线程都有一个固定大小的内存块(一般会是2MB)来做栈,这个栈会用来存储当前正在被调用或挂起(指在调用其它函数时)的函数的内部变量.这个固定大小的栈同时很大又很小.因为2 ...
- ATX agent+UIautomation2 自动化测试介绍
纯搬运贴,内容几乎来源于作者的几篇介绍文章,这里做了整合 目前ATX+UIautomator2 处于自动化界的浪口风尖,现在有幸终于有时间对ATX进行了粗浅的了解 为什么要用ATX ATX+UIaut ...
- R 实用命令 1
Quit and restart a clean R session from within R? If you're in RStudio: command/ctrl + shift + F10 . ...
- 小白学Python(5)——python-pptx简单应用
python-pptx允许您创建新的演示文稿以及对现有演示文稿进行更改. 实际上,它只允许您对现有演示文稿进行更改:只是,如果您从一个没有幻灯片的演示文稿开始,一开始感觉就像是从头开始创建一个幻灯片. ...
- Vue+springboot管理系统
About 此项目是vue+element-ui 快速开发的物资管理系统,后台用的java springBoot 所有数据都是从服务器实时获取的数据,具有登陆,注册,对数据进行管理,打印数据等功能 说 ...
- c++的构造和析构
//文件名ss.h 1 #pragma once class ss { private: char*p;//利用指针来为p申请对内存 float height; ; char sex; public: ...
- 第一章 .NET基础-C#基础
一.1.1. 基础语法 一.1.1.1. 注释符 一.1.1.1.1. 注释符的作用 l 注释 l 解释 一.1.1.1.2. C#中的3中注释符 l 单行注释 // l 多上注释 /* 要注释的内容 ...
- Android进阶之绘制-自定义View完全掌握(一)
Android的UI设计可以说是决定一个app质量的关键因素,因为人们在使用app的时候,最先映入眼帘的就是app的界面了,一个美观.充实的界面能够给用户带来非常好的体验,会在用户心中留下好的印象. ...
- C笔记_动态库和静态库
1. 静态库 创建 工程属性配置中设置为lib静态库,编辑.h文件和.c文件,生成即可. 使用 方法一: 添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录 ...
- python初级知识
一级标题 空格+内容 二级标题 空格+内容 有序内容 1.+Tab 无序内容 -+Tan 代码块 print("hello world") 三个```+回车 添加图片 表格创建 C ...