STL容器小结

 一、空间分配器算法

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

 二、迭代器和trains数据结构

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

STL的容器能够分为如下几个大类:
一:序列容器, 有vector, list, deque.
性能

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

               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
内部数据结构:双向链表。
不能随机访问一个元素。
增长任何元素都不会使迭代器失效。删除元素时,除了指向当前被删除元素的迭代器外,其它迭代器都不会失效。

总结:

一、若是你须要高效的随即存取,而不在意插入和删除的效率,使用vector
二、若是你须要大量的插入和删除,而不关心随即存取,则应使用list
三、若是你须要随即存取,并且关心两端数据的插入和删除,则应使用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桶元素,所以能够算得上是采用空间来换取时间策略。

相关文章
相关标签/搜索