STL——序列式容器的总结

序列式容器(Sequence Containers):所谓序列式容器,其中的元素都可序(ordered),但未必有序(sorted)。C++语言本身提供了一个序列式容器array,STL另外再提供了vector,list,deque,stack,queue,priority-queue等等序列式容器。其中stack和queue由于只是将deque改头换面而成,技术上被归类为一种配接器(adapter)。
array(build-in)  c++内建,vector,heap,priority-queue,list,slist(非标准),deque,stack(配接器),queue(配接器)
笔记介绍顺序:
vector,
list,
deque,
stack
queue
heap
priority_queue
slist

1.1 vector 
迭代器:
vector维护的是一个连续线性空间。
提供的是Random Access Iterators ,所以支持随机存取,
内存管理:
因旧空间不足而重新配置一个块更大的空间,然后复制元素,再释放空间。
vector以两个迭代器start和finish分别指向配置得来的连续空间中目前已被分配的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。
为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求量更大一些,以备将来的扩充,这便是(capacity)容量的观点。
STL——序列式容器的总结 - michaelkingno1 - 麦麦爱吃肉的博客
 
array是静态空间,一旦配置了就不能改变;改变空间需要客户端自己分配。
vector是动态空间,由内部机制自动扩充空间。
所谓的动态增加大小,是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就失效了。
vector的元素操作:pop_back(),erase,clear,insert。
1.2 list
list每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且对于任何位置的元素的插入和删除,list永远是常数时间。
STL list的节点(node)结构:
template<class T>
STL——序列式容器的总结 - michaelkingno1 - 麦麦爱吃肉的博客
struct _list_node{
typedef void* void_pointer;
void_pointer prev;
void_pointer next;
T data;
}
list 无法像vector一样以普通指针作为迭代器,因为其节点不保证在储存空间中连续存在。
list是一个双向链表,环状链表。并且插入操作(insert)和接合操作(splice)都不会造成原有的list迭代器失效。(vector不同)
list的元素操作:push_front(),push_back(),erase,pop_front,pop_back,clear,remove,unique,splice,merge,reverse,sort
STL——序列式容器的总结 - michaelkingno1 - 麦麦爱吃肉的博客
 
STL——序列式容器的总结 - michaelkingno1 - 麦麦爱吃肉的博客
 
STL——序列式容器的总结 - michaelkingno1 - 麦麦爱吃肉的博客
 
STL——序列式容器的总结 - michaelkingno1 - 麦麦爱吃肉的博客
 1.3 deque
vector是单向开口的连续线性空间,deque是双向开头的连续线性空间。
STL——序列式容器的总结 - michaelkingno1 - 麦麦爱吃肉的博客
因为他是动态的以分段连续空间组合而成,随时可以增加一段新的空间而链接起来。
  除非必要,应该选用vector而不是deque。对deque的排序操作,为了最高效率,可将deque先完整复制到一个vector身上,将vector排序(利用STL sort算法)后,再复制回deque.
deque的中控器
deque是连续空间(至少逻辑上看来如此),是由一段一段的定量连续空间构成,一旦有必要再deque的前端和尾端增加新空间,便配置一段定量连续空间,串接在整个deque的头端和尾端。
deque采用一块所谓的map(不是STL的map容器)作为主控。这里的map是一块连续的空间,其中每个元素都是指针,指向另一段(较大的)连续线性空间,称为 缓冲区。缓冲区才是deque的存储空间主体。
deque的元素操作:pop_back,pop_front,clear,erase,insert。
1.4 stack
以list作为底层容器
元素操作有:empty,size,back,push_back,pop_back。
1.5 queue
以list作为queue的底层容器
元素操作有:empty,size,front,back,push_front,push_back,pop_front,pop_back。
1.6 heap
heap并不属于STL容器组件,是priority queue的助手。
binary max heap 是priority queue 的底层机制。
heap的所有元素都必须遵循特别的(complete binary tree)排列规则,所以heap不提供遍历功能,也不提供迭代器。
1.7 priority_queue
由于这是一个queue,所以只允许在低端加入元素,并从顶端取出元素。
priority_queue 带有权值观念,其内的元素并非依照被推入的次序排列,而是自动依照元素的权值排列(通常权值以实值表示)。权值最高者,排在最前面。
由于priority_queue完全以底部容器(缺省下以vector为底部容器)为根据,再加上heap处理规则,所以其实现非常简单。
1.8 slist 
slist是单链表,迭代器属于单向的。list是双链表,迭代器属于双向的。
基于效率考虑,slist只提供push_front()。因此slist的元素次序会和元素插入进来的次序相反。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值