上次说了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类似。

  1. array<int, > a = {,,};
  2. array<int, > b(a);
  3.  
  4. sort(a.begin(),a.end());
  5. lower_bound(a.begin(),a.end(),);

值得一提的是当遇上C风格接口可以这样做

  1. void f(int *p, int len) {
  2. return;
  3. }
  4.  
  5. array<int,> a = {,,,};
  6.  
  7. // C 风格接口传参
  8. f(&a[], a.size());
  9. 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只能两个类型。

用法

  1. tuple<int,char,int> q(,'a',);
  2. tuple<int,char,int> p(q);
  3. p = make_tuple(,'a',);
  4.  
  5. //需要拿去元组中的某个值时候
  6. //get<>必须用常量
  7. int num1 = get<>(q);
  8. int ch = get<>(q);
  9. int num2 = get<>(q);
  10. //或者直接拆包元组
  11. tie(num1,ch,num2) = q;
  12.  
  13. //元组合并
  14. auto tup = tuple_cat(q,move(p)); // move保证为右值,上篇有说
  15.  
  16. //求某个元组的长度
  17. int len = tuple_size<decltype(tup)>::value;
  18. cout << len << endl;

那么需要遍历操作怎么办。上面说到get只能用常数,所以不能直接遍历,那么应该如何做呢,标准库做不到,但可以用一个boost的黑科技,但这个库竞赛好像是不支持的,这里就简要提一下。

  1. #include <boost/variant.hpp>
  2. template <size_t n, typename... T>
  3. boost::variant<T...> _tuple_index(size_t i, const std::tuple<T...>& tpl) {
  4. if (i == n)
  5. return std::get<n>(tpl);
  6. else if (n == sizeof...(T) - )
  7. throw std::out_of_range("overflow");
  8. else
  9. return _tuple_index<(n < sizeof...(T)- ? n+ : )>(i, tpl);
  10. }
  11. template <typename... T>
  12. boost::variant<T...> tuple_index(size_t i, const std::tuple<T...>& tpl) {
  13. return _tuple_index<>(i, tpl);
  14. }

这样就可以直接用下面方式遍历了,

  1. for(int i = ; i != tuple_len(tup); ++i)
  2. std::cout << tuple_index(i, tup) << std::endl;

在C++17中,variant已经被列入标准库。tuple虽然方便,但是标准库提供的功能有限,某些功能还是无法实现。就当个pair扩展版用也挺好qwq

C++11新增容器以及元组的更多相关文章

  1. hive 0.10 0.11新增特性综述

    我们的hive版本升迁经历了0.7.1 -> 0.8.1 -> 0.9.0,并且线上shark所依赖的hive版本也停留在0.9.0上,在这些版本上有我们自己的bug fix patch和 ...

  2. c++11 List 容器

    c++11 List 容器 List简介 list是一个双向链表容器        可高效地进行插入删除元素.         list不可以随机存取元素,所以不支持at(pos)函数与[]操作符.  ...

  3. Java SE 11 新增特性

    Java SE 11 新增特性 作者:Grey 原文地址:Java SE 11 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  4. 11.python中的元组

    在学习什么是元组之前,我们先来看看如何创建一个元组对象: a = ('abc',123) b = tuple(('def',456)) print a print b

  5. c++11新增的一些便利的算法

    c++11新增加了一些便利的算法,这些新增的算法使我们的代码写起来更简洁方便,这里仅仅列举一些常用的新增算法,算是做个总结,更多的新增算法读者可以参考http://en.cppreference.co ...

  6. c++11——改进容器性能

    使用emplace_back就地构造 emplace_back能就地通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好的避免内存的拷贝和移动,使得容器插入元素的性能得到进一步提升. ...

  7. JAVA编程思想(第四版)学习笔记----11.4 容器的打印

    import static java.lang.System.out; import java.util.ArrayList; import java.util.Collection; import ...

  8. c++11の顺序容器

      容器是一种容纳特定类型对象的集合.C++的容器可以分为两类:顺序容器和关联容器.顺序容器的元素排列和元素值大小无关,而是由元素添加到容器中的次序决定的.标准库定义了三种顺序容器的类型:vector ...

  9. c++11の关联容器

    一.关联容器 C++的容器类型可以分为顺序容器和关联容器两大类.对于关联容器,主要有map和set,对于这两种,根据不同的维度,衍生出了8种容器 map                        ...

随机推荐

  1. git码云的使用基础(为了以后更好的协同操作)

    git手册 安装教程 windows 不需要什么操作点点点就好 设置一个文件夹当成本地仓库 第一次上传 git init# 创建一个本地的仓库 git add. 当前文件夹下所有内容# 添加到暂存区 ...

  2. ASP.NET Core MVC 之区域(Area)

    区域(Area)是一个 ASP.NET MVC 功能,用于将相关功能组织为一个单独的命名空间(用于路由)和文件结构(用于视图).使用区域通过向控制器和操作添加 一个路由参数(area)来创建用于路由目 ...

  3. Day 02--选题与设计(二)

    1.今天我们主要设计了一下我们微信小程序可以实现的功能,客户操作的基本流程,研究了墨刀这个工具的使用方法并试着将想法转化为原型设计项目.我们给自己的系统起名为“天天好餐”.我们认为食堂订送餐与网络上的 ...

  4. Go_笔试题记录-不熟悉的

    1.golang中没有隐藏的this指针,这句话的含义是() A. 方法施加的对象显式传递,没有被隐藏起来 B. golang沿袭了传统面向对象编程中的诸多概念,比如继承.虚函数和构造函数 C. go ...

  5. Nacos(三):Nacos与OpenFeign的对接使用

    前言 上篇文章中,简单介绍了如何在SpringCloud项目中接入Nacos作为注册中心,其中服务消费者是通过RestTemplate+Ribbon的方式来进行服务调用的. 实际上在日常项目中服务间调 ...

  6. Kali-Linux-美化与优化

    照理说,linux的桌面是不应当存在在这个世界上的,作为一个linux用户,一味捣鼓桌面显得hin-不专业.但是,虚拟机要用到,浏览器要用到--更何况,自己的老婆能不打扮一下么? update:201 ...

  7. Python循环语句及函数的定义

      循环语句¶ 重复执行某一个固定的动作或者任务 语法 for 变量 in序列: 语句1 语句2 ..... In [2]: # 列表知识只是以后会讲 # 比如[1,2,3,4,5,6,7] list ...

  8. 深入Java源码剖析之字符串常量

    字符串在Java生产开发中的使用频率是非常高的,可见,字符串对于我们而言非常关键.那么从C语言过来的同学会发现,在C中是没有String类型的,那么C语言要想实现字符串就必须使用char数组,通过一个 ...

  9. [Python] 常见的排序与搜索算法

    说明: 本文主要使用python实现常见的排序与搜索算法:冒泡排序.选择排序.插入排序.希尔排序.快速排序.归并排序以及二分查找等. 对算法的基本思想作简要说明,只要理解了基本的思想,与实现语言无关. ...

  10. Linux 下安装 mysql8

    1.下载mysql wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.13-linux-glibc2.12-x86_64.tar 2. ...