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. get post 知多少

    GET与POST简介 POST和GET都属于http请求的方法,所以都包含开始行,头域,头域结束符,消息主体,但是,他们同样存在很多异同,为了更好的区别这两种请求,我们对他们的异同进行具体的分析. 表 ...

  2. 【翻译+整理】.NET Core的介绍

    .NET Core 是一个通用开发平台,它由微软和开源社区共同管理(git hub的.NET开源社区): 他支持Windows,macOS和Linux,并且可以运行在硬件设备中.云平台上和物联网嵌入式 ...

  3. 谈谈new Thread的弊端及Java四种线程池的使用

    1.new Thread的弊端执行一个异步任务你还只是如下new Thread吗? new Thread(new Runnable() { @Override public void run() { ...

  4. Spring MVC 笔记 —— Spring MVC 文件上传

    文件上传 配置MultipartResolver <bean id="multipartResolver" class="org.springframework.w ...

  5. java中的ArrayList 、List、LinkedList、Collection关系详解

    一.基础介绍(Set.List.Map) Set(集):集合中的元素不按特定方式排序,并且没有重复对象.他的有些实现类能对集合中的对象按特定方式排序. List(列表):集合中的元素按索引位置排序,可 ...

  6. 微信JSAPI支付 跟 所遇到的那些坑

    首先介绍一下我在调用微信支付接口使用的是 weixin.senparc SDK,非常方便好用开源的一个微信开发SDK. weixin.senparc SDK 官网:http://weixin.senp ...

  7. Unity3D【新手问题】阴影效果不显示的原因

    Unity 不显示阴影的原因: 模型尺寸太大了,镜头比较远 把模型缩小,镜头一定要拉到最近才能看到 这是我遇到的问题和解决方法, 另外一定要设置 Directional light 的 shadow ...

  8. Writing clean code is what you must do in order to call yourself a professional.

    Clean Code  A Handbook of Agile Software Craftsmanship

  9. 本地存储 cookie,session,localstorage( 二)angular-local-storage

    原文:https://github.com/grevory/angular-local-storage#api-documentation Get Started (1)Bower: $ bower ...

  10. owa_outlook暴力破解脚本

    其实msf里面存在这样的模块,search owa 即可,字典这种东西还是找规律密码去破解比较好 然后担心遇到渗透测试没有msf情况下,还是得自己写个脚本,网上找了一下lijiejie,但是运行不了, ...