赞
踩
访问 | push_back() | push_front() | insert() | pop_back() | pop_front() | erace() | find() | |
list | O(n) | O(1) | O(1) | O(1) | O(1) | O(1) | O(1) | |
vector | O(1) | O(1) | \ | O(n) | O(1) | \ | O(n) | |
deque | O(1) | O(1) | O(1) | O(n) | O(1) | O(1) | O(n) | |
map | O(log n) | \ | \ | O(log n) | \ | \ | O(log n) | O(log n) |
multimap | 同上 | 同上 | 同上 | 同上 | ||||
set | O(log n) | \ | \ | O(log n) | \ | \ | O(log n) | O(log n) |
multiset | 同上 | 同上 | 同上 | 同上 |
补充:
map, set, multimap, and multiset
上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种。不同操作的时间复杂度近似为:
插入: O(logN)
查看:O(logN)
删除:O(logN)
hash_map, hash_set, hash_multimap, and hash_multiset
上述四种容器采用哈希表实现,不同操作的时间复杂度为:
插入:O(1),最坏情况O(N)。
查看:O(1),最坏情况O(N)。
删除:O(1),最坏情况O(N)。
是动态数组,在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放;如果新值大于当前大小时才会重新分配内存
扩容方式:
1、倍数开辟二倍的内存
2、旧的数据开辟到新内存
3、释放旧的内存
4、指向新内存特点:
- 拥有一段连续的内存空间,并且起始地址不变,因此能够非常好的支持随机存取,即[]操作符,但是由于它的内存空间是连续的,所以在头部和中间进行插入和删除操作会造成内存块的拷贝,另外,当该数组的内存空间不够时,需要重新申请一块足够大得内存并且进行内存的拷贝,这些都大大的影响了vector的效率。
- 对头部和中间进行添加删除元素操作需要移动内存,如果你得元素是结构或类,那么移动的同时还会进行构造和析构操作,所以性能不高
- 对任何元素的访问时间都是O(1)
- ,所以常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作
- 属性与string差不多,同样可以使用capacity看当前保留的内存,使用swap来减少它使用的内存,如push_back 1000个元素,capacity返回值为16384
- 对最后元素操作最快(在后面添加删除元素最快),此时一般不需要移动内存,只有保留内存不够时才需要
元素存放在堆中,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供[]操作符的重载。但是由于链表的特点,它可以很有效率的支持任意地方的删除和插入操作。
优点:可以在任意位置进行插入删除
缺点:访问效率低
特点:
- 没有空间预留习惯,所以每分配一个元素都会从内存中分配,每删除一个元素都会释放它占用的内存;
- 在哪里添加删除元素性能都很高,不需要移动内存,当然也不需要对每个元素都进行构造与析构了,所以常用来做随机插入和删除操作容器;
- 访问开始和最后两个元素最快,其他元素的访问时间都是O(n);
- 如果经常进行添加和删除操作并且不经常随机访问的话,使用list
是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪。向deque 两端添加或删除元素的开销很小。它不需要重新分配空间,所以向末端增加元素比vector 更有效。
deque 是对vector 和list 优缺点的结合,它是处于两者之间的一种容器。
特点:
- 随机访问方便;
- 可以在内部进行插入和删除操作;
- 可以在两端进行push和pop
map由红黑树实现,其元素都是键值对,每个元素的键是排序的准则,每个键只能出现一次,不允许重复
特点
1)元素为键值对形式,键和值可以是任意类型
2)因为key有序,所以可以通过二分对key进行快速查找
3)增加和删除结点对迭代器的影响很小,除了当前结点是迭代器指向的结点
4)对于迭代器来说,可以修改值,但是不能修改key
优缺点和适用场景
优点:适用平衡二叉树实现,便于元素查找,而且可以把值映射到另外一个值,可以创建字典
缺点:每次插入都需要调整红黑树,对效率存在一定的影响
适用场景:适用于需要储存一个字典,并要求方便的根据key找value的场景
set由红黑树实现,其内部元素依照其值自动排序,每个元素只出现一次,不允许重复(红黑树是平衡二叉树的一种)
特点
1)元素有序
2)无重复元素
3)插入删除操作的效率比序列容器高,因为对于关联容器来说,不需要做内存的拷贝和内存的移动
优缺点及适用场景
优点:使用平衡二叉树实现,便于元素查找,而且保持了元素的唯一性,支持自动排序
缺点:每次插入元素,都需要调整红黑树,效率有一定的影响
适用场景:适用与经常查找一个元素是否在某集群中并且不要排序的场景
multimap和map相同,但允许重复元素,也就是说multimap可包含多个键值(key)相同的元素。这里不再做过多介绍。
multiset和set相同,只不过它允许重复元素,也就是说multiset可包括多个数值相同的元素。
(可用于求数列中最小的k个数——面试题40)
其他:
stack,queue,prioroty_queue都属于容器配接器,是由容器按照特殊的逻辑实现的
小结:
1)如果需要高效的随机存取,不在乎插入和删除的效率,使用vector
2)如果需要大量的插入和删除元素,不关心随机存取的效率,使用list
3)如果需要随机存取,并且关心两端数据的插入和删除效率,使用deque
4)如果打算存储数据字典,并且要求方便地根据key找到value,一对一的情况使用map,一对多的情况使用multimap
5)如果打算查找一个元素是否存在于某集合中,唯一存在的情况使用set,不唯一存在的情况使用multiset
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。