容器containers解析

侯捷老师STL课程笔记
容器containers解析

容器

容器的分类

1、Sequence Containers

===============================

Array:数组,定义多大的空间就只能用多大,无法扩充,超过就会越界。
容器containers解析


Vector:

  • 起点处不能动,后面可以扩充。
  • 当空间不够时,会自动的扩充空间(利用分配器自动的执行扩充)。扩充空间时两倍增长。
    容器containers解析

Deque:
- 双向队列,前后两端可进可出。
- 此容器本身没有sort()函数,如果排序使用全局的sort(deque.begin(), deque.end())。
- 每次增加一个buffer的容量,每个buffer之间可以不连续。
容器containers解析
deque可以分散出queue(队列)和stack(栈)
stack:没有iterator,因为会破坏它先进后出的特性。
容器containers解析
queue:没有iterator。
容器containers解析


List:
- 双向(环状)链表,用双向指针连起来的。
- 自身带有sort函数。不可以直接使用全局sort()。
- 每次扩充一个结点,资源利用率高。
- 但是查找困难。
容器containers解析


Forward-List:
- 单向链表,单向指针链接起来的,耗用的内存比list少。
- 只有push_front()
容器containers解析
容器containers解析


注:有时候直接使用::find()函数,要比经过排序后再查找要快(时间浪费到排序上)

2、Associative Containers

===============================

用于大量查找使用关系型容器,内部是红黑树(平衡)


Set:

  • set表示存放的元素不能重复
  • 如果存入随机数,size比元素多,不会存入重复的元素。

Multiset:

  • 只有value。(set表示存放的元素不能重复,Multiset可以重复)
  • 插入元素的函数是multiset.insert(),插入位置不是头也不是尾。
  • 容器本身有find。查找很快。

容器containers解析


Map:

  • 红黑树
  • 不重复
  • Map表示存放key不能重复,Multimap可以重复。
  • 可以使用[],例:c[i] = string[buf],Map表示存放key不能重复即i不重复。

Multimap:

  • Map的每一个节点都有两个部分:key和value,利用key查找value。
  • Map表示存放key不能重复,Multimap可以重复。
  • multimap不可使用[ ]做insertion。
  • 插入元素因为是由key和value组成,所以要用pair去组合。例:c.insert(pair< long, string >(i, buf))
  • 容器有find().
  • 不可以使用[]进行添加元素,只能用insert。

容器containers解析


Unordered Containers: HashTable Separate Chaining
不是红黑树结构,使用哈希表的结构。


1、Unordered Set/Multiset

  • insert插入
  • bucket是比元素多,有的bucket是空的。
  • 如果元素比bucket大,那么bucket两倍扩充。
  • 容器自己的find比全局的find快很多很多
    容器containers解析

2、Unordered Map/Multimap
- multimap不可使用[ ]做insertion。

容器containers解析


每个结点连接链表,链表不能够太长,也就是每个结点对应的数据不能太多,链表过长会影响查找速度。
容器containers解析
http://www.cplusplus.com