1、空间分配器

  std::alloc用于容器中内存空间的分配和释放,以及分配内存的管理。construct()、destroy()等全局函数用于为对象的构造和析构。

2、迭代器和trains

  迭代器将容器和算法联系起来,行为类似指针。各个容器都自己实现自己的迭代器,最重要的是对operator*和operator-> 进行重载。每个迭代器里都定义了一些类型,包括所指对象的类型。trains将这些类型提取出来。

STL的容器可以分为以下几个大类:
一:序列容器, 有vector, list, deque.

 : 关联容器,     set, multiset, map, mulmap

hash_set,hash_map, hash_multiset, hash_multimap

序列容器是表示容器可序的,注意不是已经排好序的。比如vector,可以通过push_back记录下进入数组的顺序。

(1) vector
内部数据结构:数组。
随机访问每个元素,所需要的时间为常量。
vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同)。当把超过capacity()-size()个元素插入 vector中时,内存会重新分配,所有的迭代器都将失效;否则,指向当前元素以后的任何元素的迭代器都将失效。当删除元素时,指向被删除元素以后的任何 元素的迭代器都将失效。

在添加新元素时,如果剩余空间足够,就之间添加;如果剩余空间不够,需要开辟一块新的内存(为原内存2倍),然后复制旧的内存到新内存,添加元素,释放就内存。

(2)deque(双端队列)
内部数据结构:一段段数组(空间)。还分配了一段连续空间用来管理这些数组。
随机访问每个元素,所需要的时间为常量。
增加任何元素都将使deque的迭代器失效。在deque的中间删除元素将使迭代器失效。在deque的头或尾删除元素时,只有指向该元素的迭代器失效。

stack(堆)和queue(队列)默认底层的数据结构都是deque,stack是只有一端进出;queue是一端进,一端出。默认是deque,用list也能实现

(3)list
内部数据结构:双向链表。
不能随机访问一个元素。
增加任何元素都不会使迭代器失效。删除元素时,除了指向当前被删除元素的迭代器外,其它迭代器都不会失效。

总结:

1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque

(3)set  map

基于红黑树(RB-tree),查找(插入、删除)的时间复杂度是对数的O(logN)。自定义的键值类型需要重载<运算符,因为set、map是有排序的。

如果迭代器所指向的元素被删除,则该迭代器失效。其它任何增加、删除元素的操作都不会使迭代器失效。

(3)hash_set  hash_map

底层使用hash_table,vector作为数组,用开链法解决散列冲突。键值类型要实现hash函数,有的内置类型在hash_table中有默认的hash函数,但是自定义类型没有。所以合适的数组大小,hash函数对性能的影响很大。

与set、map相比:

1.查找(插入、删除)可能更快:在“不碰撞的情况下”,其实换句话说,就是要有足够好的hash函数,它要能使key到value的映射足够均匀,认为它是O(1)级的;否则,在最坏的情况下,它的计算量就退化到O(N)级,变成和链表一样。

2.需要更多内存:通过Hash表来加快查找过程,将待存数据的key经过映射函数变成一个数组(一般是vector)的索引,STL是用开链的方法来解决的,每一个数组的元素维护一个list,他把相同索引值的数据存入一个list;但是需要更多的内存来存放这些Hash桶元素,因此可以算得上是采用空间来换取时间策略。

STL容器小结的更多相关文章

  1. 23.STL容器小结

  2. STL容器简介

    stl不是面向对象的编程,而是一种不同的编程模式————泛型编程 我们常用到的STL容器有vector.list.deque.map.multimap.set.multiset 顺序性容器:vecto ...

  3. C++ STL 知识小结

    qwq...接近联赛,就在这里对STL做一点知识小结吧,因为STL曾经失分很多. 简介 (来自Baidu) STL是Standard Template Library的简称,中文名标准模板库,惠普实验 ...

  4. STL容器

    啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...

  5. c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  6. STL容器删除元素的陷阱

    今天看Scott Meyers大师的stl的用法,看到了我前段时间犯的一个错误,发现我写的代码和他提到错误代码几乎一模一样,有关stl容器删除元素的问题,错误的代码如下:std::vector< ...

  7. 【转】c++中Vector等STL容器的自定义排序

    如果要自己定义STL容器的元素类最好满足STL容器对元素的要求    必须要求:     1.Copy构造函数     2.赋值=操作符     3.能够销毁对象的析构函数    另外:     1. ...

  8. GDB打印STL容器内容

    GDB调试不能打印stl容器内容,下载此文件,将之保存为~/.gdbinit就可以使用打印命令了. 打印list用plist命令,打印vector用pvector,依此类推. (gdb) pvecto ...

  9. STL学习小结

    STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些" ...

随机推荐

  1. hdu 1507

    求能出售多少个1*2的矩形,,将原图染色,(i+j)%2==0的染白色,其余为黑色, 求白色跟黑色的最大匹配 #include<stdio.h> #include<string.h& ...

  2. HDOJ 1755 - A Number Puzzle 排列数字凑同余,状态压缩DP

    dp [ x ] [ y ] [ z ] 表示二进制y所表示的组合对应的之和mod x余数为z的最小数... 如可用的数字为 1 2 3 4...那么 dp [ 7 ] [ 15 ] [ 2 ] = ...

  3. 16Khz音频定时触发采样DMA存储过程

    一.AD Setting 1.Calibration (ADCAL) 2.设定ADC Chennel与SCANDIR等,在低功耗应用方案,选择PCLK/4,并设置SMP(tCONV = Samplin ...

  4. Android tools:context=".MainActivity"的作用

    <TextView android:layout_width="wrap_content" android:layout_height="wrap_content& ...

  5. 怎样清除SWAP里的文件

    在vim 编辑一个文件时断了网,文件就留在SWAP里,但我再vim这个文件保存后,再打开时又提示SWAP里有这文件了,此时swapoff -a后再ls -al查看,把文件所在目录里*.swp结尾的文件 ...

  6. ubuntu安装 cober 笔记

    设置原始Ubuntu原始Root密码 安装Mysql 安装Jdk 拷贝Cober到Linux,启动服务(看日志) 设置原始Ubuntu原始Root密码 $ sudo passwd root 修改系统文 ...

  7. [JAVA] 学java必看书籍

    <java编程思想>,<Effective Java>,<JVM虚拟机规范>     <Java核心技术>    <Java Web开发技术大全& ...

  8. Microsoft Edge与Google Chrome那些不同的举止

    以下针对14393版本Edge与Chrome 54 html dom/select的如果options里没有符合的值时edge会选择第一个,chrome(54)会置空选项 html dom/input ...

  9. TMCache

    TMCache设计的目的是用于存储临时持久化对象的开源iOS/OS  key/value缓存类库,减少重复创建像下载数据.缓慢的处理结果这样的昂贵性能花销.TMCache由两个本身相似的存储组成,一个 ...

  10. 图片,音频资源预加载和文档dom加载

    在项目中遇到一个问题,ajax请求音频资源,然后动态的插入到文档中,其中.原生的音频外观实在太丑了,而且每个浏览器的样式都不一样,采取了一个audio插件. 就遇到一个问题,请求后的直接调用插件的话, ...