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. 调试PostSharp DEMO 遇到的问题

    我今天在WIN7下的VS2010.VS2012调试PostSharp例子程序,下载的是PostSharp1.5版本,但是就是不进断点啊,我想了想这是怎么回事啊,于是我更换了2.0的再进行调试具然好使了 ...

  2. TensorFlow 入门之手写识别(MNIST) softmax算法

    TensorFlow 入门之手写识别(MNIST) softmax算法 MNIST flyu6 softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  3. hdu4474 Yet Another Multiple Problem

    Yet Another Multiple Problem Description There are tons of problems about integer multiples. Despite ...

  4. UVa1003-Cutting sticks

    试题描述 将一段木棒按要求切割,每次切割都要付出与木棒长度相同的代价,求最小代价切割. (多组数据) 输入描述 长度L. 切割点数n(n<=50). n个切割点. 输出描述 "The ...

  5. 第一章 引言--《设计模式-可复用面向对象软件的基础》Erich Gamma

    第一章 引言 本章主要是让我们大致明白设计模式是干嘛用的,模式分类,设计模式如何解决设计问题以及几种常见的面向对象设计中软件的复用方法. 1.什么是设计模式? 个人理解概括,设计模式是对一类问题的抽象 ...

  6. Android开发(22)--seekBar采用handler消息处理操作

    本案例简单实现进度条可走,可拖拽的功能,下面请看源码: 布局文件: <RelativeLayout xmlns:android="http://schemas.android.com/ ...

  7. crudandroidandroid——CRUD(在上一篇博客的基础上)

    废话就不多说了,开始... 1.Person package com.njupt.sqlite; public class Person { private Integer id; private S ...

  8. 解决eclipse项目下出现deployment descriptor和jax-ws web services

    当你的web项目下出现这个这些鬼东西的时候,是视图的原因 1.右上角切换视图到java,看看问题解决了没,如果没有,第二步 2.window->perspective->reset per ...

  9. Jmeter对基于websocket协议的压力测试

      WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex).   浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就 ...

  10. Ionic的项目结构-工程目录

    做前端的都应该知道一个框架  Ionic  这个是移动端webAPP最好用的吧(个人认为),那今天就来说说这个项目的结构以及文件的含义,希望对大家有所帮助 想看如何生成文件的话详细看我上篇博客 在用编 ...