一、各容器内存存储结构
二、各容器特征描述
(1)array
创建:固定长度;
存储方式:连续存储数组;
访问元素:可随机访问;
增减元素:不支持;
(2) vector
创建:不定长度,单向增长;
存储方式:连续存储数组,增加元素时内存动态增加大于元素大小;
访问元素:可随机访问;
增减元素:尾加减元素时间复杂度尾O(1),中间加减元素时间复杂度尾O(n);
(3)deque
创建:不定长度,双向增长;
存储方式:外部表现连续存储数组,增加元素时内存动态增长块;
访问元素:可随机访问;
增减元素:头尾加减元素时间复杂度尾O(1);
(4)list
创建:不定长度,任意插入;
存储方式:不连续存储双向循环链表;
访问元素:双向顺序遍历访问,时间复杂度尾O(n);
增减元素:任意位置加减元素时间复杂度尾O(1);
(5)forward_list
创建:不定长度,任意插入;
存储方式:不连续存储单向链表;
访问元素:从前往后顺序遍历访问,时间复杂度尾O(n);
增减元素:任意位置加减元素时间复杂度尾O(1);
(6)slist(非标准容器)
同forward_list
(7)stack
deque的适配器,元素不能遍历,只能后进先出。
(8)queue
deque的适配器,元素不能遍历,只能先进先出。
(9)priority_queue
vector的适配器,只能访问第一个元素,并且始终是优先级最高元素。
(10)set
创建:不定长度,键值就是数值,键值唯一;
存储方式:红黑树存储;
访问元素:时间复杂度O(logN);
增减元素:时间复杂度O(logN);
(11)multiset
键值不唯一,其他同set;
(12)map
创建:不定长度,有键值和元素组成,键值唯一;
存储方式:红黑树存储;
访问元素:时间复杂度O(logN);
增减元素:时间复杂度O(logN);
(13)multimap
键值不唯一,其他同map;
(14)unordered_set
创建:不定长度,键值就是数值,键值唯一;
存储方式:哈希表;
访问元素:时间复杂度O(1);
增减元素:时间复杂度O(1);
(15)unordered_multiset
键值不唯一,其他同unordered_set;
(16)unordered_map
创建:不定长度,有键值和元素组成,键值唯一;
存储方式:哈希表;
访问元素:时间复杂度O(1);
增减元素:时间复杂度O(1);
(17)unordered_multimap
(18)hash_set
非标准库,同unordered_set
(19)hash_multiset
非标准库,同unordered_multiset
(20)hash_map
非标准库,同unordered_map
(21)hash_multimap
非标准库,同unordered_mutimap
三、容器使用注意点
(1)容器内有函数同标准库函数一样,则优先考虑容器内函数,因为每个容器针对本身的结构实现不同方法,效率更高,如sort,find;
(2)迭代器遍历容器到最后,指向最后一个元素的后一个位置,不能做解引用操作;
(3)用auto关键字方便容器遍历。如:
vector<double> vct;
for(auto elem :vct){
statement; //遍历容器元素,不改变容器元素内容
}
for(auto &elem :vct){
statement; //遍历容器元素,改变容器元素内容
}