C++ STL 容器 的 基本特性 和 原理

 

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

: 关联容器,     set, multiset, map, mulmap数组

               hash_set,hash_map, hash_multiset, hash_multimap数据结构

: 其余的杂项: stack, queue, valarray, bitsetide

 

STL各个容器的实现:函数

 

(1) vector
内部数据结构:数组。
随机访问每一个元素,所须要的时间为常量。
在末尾增长或删除元素所需时间与元素数目无关,在中间或开头增长或删除元素所需时间随元素数目呈线性变化。
可动态增长或减小元素,内存管理自动完成,但程序员可使用reserve()成员函数来管理内存。
vector
的迭代器在内存从新分配时将失效(它所指向的元素在该操做的先后再也不相同)。当把超过capacity()-size()个元素插入 vector中时,内存会从新分配,全部的迭代器都将失效;不然,指向当前元素之后的任何元素的迭代器都将失效。当删除元素时,指向被删除元素之后的任何 元素的迭代器都将失效。spa

 

(2)deque
内部数据结构:数组。
随机访问每一个元素,所须要的时间为常量。
在开头和末尾增长元素所需时间与元素数目无关,在中间增长或删除元素所需时间随元素数目呈线性变化。
可动态增长或减小元素,内存管理自动完成,不提供用于内存管理的成员函数。
增长任何元素都将使deque的迭代器失效。在deque的中间删除元素将使迭代器失效。在deque的头或尾删除元素时,只有指向该元素的迭代器失效。排序

 

(3)list
内部数据结构:双向环状链表。
不能随机访问一个元素。
可双向遍历。
在开头、末尾和中间任何地方增长或删除元素所需时间都为常量。
可动态增长或减小元素,内存管理自动完成。
增长任何元素都不会使迭代器失效。删除元素时,除了指向当前被删除元素的迭代器外,其它迭代器都不会失效。队列

(4)slist
内部数据结构:单向链表。
不可双向遍历,只能从前到后地遍历。
其它的特性同list类似。内存

(5)stack
适配器,它能够将任意类型的序列容器转换为一个堆栈,通常使用deque做为支持的序列容器。
元素只能后进先出(LIFO)。
不能遍历整个stackci

(6)queue
适配器,它能够将任意类型的序列容器转换为一个队列,通常使用deque做为支持的序列容器。
元素只能先进先出(FIFO)。
不能遍历整个queue

(7)priority_queue
适配器,它能够将任意类型的序列容器转换为一个优先级队列,通常使用vector做为底层存储方式。
只能访问第一个元素,不能遍历整个priority_queue
第一个元素始终是优先级最高的一个元素。

(8)set
按照键进行排序存储, 值必须能够进行比较, 能够理解为set就是键和值相等的map
键惟一。
元素默认按升序排列。
若是迭代器所指向的元素被删除,则该迭代器失效。其它任何增长、删除元素的操做都不会使迭代器失效。

(9)multiset
键能够不惟一。
其它特色与set相同。

(10)hash_set
set相比较,它里面的元素不必定是通过排序的,而是按照所用的hash函数分派的,它能提供更快的搜索速度(固然跟hash函数有关)。hash_setkey进行hash 而后将key放在hash值对应的桶中, 原理能够这样理解, hash_set就是key value相等的hash_map
其它特色与set相同。

(11)hash_multiset
键能够不惟一。
其它特色与hash_set相同。

(12)map
键惟一。
元素默认按键的升序排列。
若是迭代器所指向的元素被删除,则该迭代器失效。其它任何增长、删除元素的操做都不会使迭代器失效。

(13)multimap
键能够不惟一。
其它特色与map相同。

(14)hash_map
map相比较,它里面的元素不必定是按键值排序的,而是按照所用的hash函数分派的,它能提供更快的搜索速度(固然也跟hash函数有关)。
其它特色与map相同。

(15)hash_multimap
键能够不惟一。
其它特色与hash_map相同。

相关文章
相关标签/搜索