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. Jquery控制点击时一、二级菜单自由隐藏与出现

    一.基本HTML和CSS HTML中产生一.二级导航的代码: {loop $nav $key $value} <div class=”u_con”> <span class=” xg ...

  2. 蓝牙UUID——Android各种蓝牙设备的UUID

    本文转自:http://www.14blog.com/archives/481 UUID是“Universally Unique Identifier”的简称,通用唯一识别码的意思.对于蓝牙设备,每个 ...

  3. JavaScript中的call 和apply的用途以及区别

    apply 接受两个参数,第一个参数指定了函数体内this 对象的指向,第二个参数为一个带下标的集合,这个集合可以为数组,也可以为类数组,apply 方法把这个集合中的元素作为参数传递给被调用的函数: ...

  4. 结构-行为-样式-Js排序算法之 快速排序

    快速排序算法,是我的算法系列博客中的第二个Js实现的算法,主要思路:    在一个数组中随机取一个数(一般都取第一个或者最后一个),使这个数与数组中其他数进行比较,如果比它大就放到它的右边,比它小就放 ...

  5. 【BJG吐槽汇】第2期 - 我每周1-2次迟到都是因为你-->ios10!

    本期槽点嘉宾:苹果系统 ios10 小吐我记得iphone是在2008年出的,当时我还在用诺基亚N70,对iphone是十分的陌生,想必大家也是,直到iphone4的时候,黄牛成群,饥饿营销,包括出i ...

  6. CodeForces 213B Numbers

    $dp$,组合数. $dp[i][j]$表示只用数字$i$,$i+1$,$i+2$......,$9$,凑成长度为$j$的并且数字$i$到$9$符合要求的方案数.只要枚举数字$i$用几个就可以转移了. ...

  7. 详解一下网络广告cpc、cpm、cpl、cpa、cps、cpr的计费方法是什么

    CPC(Cost per click)按照 广告 点击数 计费 ,限定一个IP在24小时内只能点击一次.CPM(Cost per mille)按照广告显示次数来计算广告费,可在短时间内为 网站 带来巨 ...

  8. kali2.0 + LAMP

    0x01 更新源 leafpad /etc/apt/sources.list #中科大kali源 deb http://mirrors.ustc.edu.cn/kali sana main non-f ...

  9. github从上传代码到发布静态网站

    1.上传代码 第一步:建立git仓库 cd到你的本地项目根目录下,执行git命令 git init 第二步:将项目的所有文件添加到仓库中 git add . 如果想添加某个特定的文件,只需把.换成特定 ...

  10. java方法笔记

    1.方法 方法(method),函数(function)//但本质上是一样的--实现特定的功能.程序中完成独立功能,可重复使用的一段代码的集合:方法的格式:[修饰符] 返回值的类型 方法名称([形式参 ...