> 文章列表 > STL容器总结

STL容器总结

STL容器总结

1.Vector:
本质是动态数组,拥有一段连续的内存空间,并且起始地址不变,能非常好的支持随机存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,如果空间不够,则另外分配新的两倍大小的空间,然后把旧空间释放掉。这些都大大影响了vector的效率。
vector不适合push_front(效率很低)。
vector不适合中间插入及删除操作,中间插入及删除操作会引起内存拷贝。
2.List:
双向链表, 它的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变的非常没有效率,因此它没有提供[]操作符的重载,但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。
list适合插入删除频繁的场所,不管插入还是删除,时间基本上都是常数。
list不适合随机线性访问
3.Deque:
deque在逻辑上看起来是连续的空间,内部是一段一段的定量连续空间构成,一旦有必要在deque的前端或尾端增加新空间,deque会配置一段定量的连续空间,串联在整个deque的头部或尾部。
deque采用一块所谓的map(注:不是stl里面的map容器)作为中控器,其实就是一小块连续空间,其中的每一个元素都是指针,指向另外一段较大的连续线性空间,称之为缓冲区
设计deque迭代器应该具备两个特征的结构和功能:
1.既然deque存储空间是分段的连续空间,迭代器应该能够指出当前的连续空间在哪里。
2.因为缓冲区有边界,迭代器还应该能判断当前是否处于缓冲区的边缘,如果是,一旦前进或后退,
就必须跳转到下一个或上一个缓冲区。
deque实际上是在功能上合并了vector和list。
优点:
随机访问方便,即支持[]操作和vector.at();
在内部方便的进行插入和删除操作;
可在两端进行push、pop。
缺点:
因为涉及数据结构的维护比较复杂,采用分段连续空间,所以占有内存相对多。
使用区别:
如果需要高效的随机存储,而不在乎插入和删除的效率,则使用vector。
如果需要大量的插入和删除,而不关心随机存取,则应使用list。
如果需要随机存取,且关心亮度数据的插入和删除,则应使用deque。
STL容器总结
STL容器总结
4.Stack:
stack是deque的一种变种,优缺点不变。
5.Queue:
queue是deque的一种变种,优缺点不变。
6.Heap:
容器采用二叉树存储数据,所以heap容器适合经常排序的场所,heap容器里的数据是自动排序的。
7.Map:
STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个称为该关键字的值)的数据处理能力,由于这个特性map内部的实现自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能。
8.Set:
set是集合,set中不会包含重复的元素,这是和vector的第一个区别,第二个区别是set内部用平衡二叉树实现,便于元素查找,而vector是使用连续内存存储,便于随机存取。