STL中序列式容器包含如下:array,vector,list,deque,priority-queue,slist,stack,queue。其中array属于C++语言的内建的数据结构,另外stack和queue属于适配器,两者均采用deque作为底层的数据容器。
(一) vector
1、特点:动态空间,随着元素的加入,内部机制会自行扩充空间以容纳新元素。“配置新空间,数据移动,释放旧空间”
2、程序示例:
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
vector<int> sv(2,10); //初始化定义 2个元素,初始值为10
cout<<sv.size()<<endl; // 2 元素个数
cout<<sv.capacity()<<endl; // 2 总容量
sv.push_back(3); //添加元素到尾部
cout<<sv[0]<<endl;
sv.pop_back(); //添加
vector<int>::iterator ite=find(sv.begin(),sv.end(),10);
if(ite!=sv.end())
sv.insert(ite,1,7);
return 0;
3.内存管理:
增加新数据或插入新数据时,需要检查备用空间是否足够,vector有三个索引参数:start、finish、end_of_storage.
前两个参数指向已用空间的首位,最后一个参数指向备用空间的最后一个地址。若插入数据所需内存大于备用空间,则需要重新配置原地址空间两倍大小的空间,然后把现有数据全部拷贝过去,然后释放旧空间。
(二) list
1、 特点:双向链表,只能顺序访问,插入操作不会使原有数据的迭代器失效。
2、 程序示例:
template<classT>
struct_list_node{
typedefvoid* void_pointer;
void_pointerprev;
void_pointernext;
Tdata;
}
3、 内存管理:
设计有专有的节点内存配置、释放、构造、销毁的函数,采用空间配置器中的allocate和deallocate,construct和destory;
(三) deque
1、 特点:双向开口的连续线性空间,头尾两端均可做元素的插入和删除操作。没有容量的概念,动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。采用一小块连续空间(中控器),其中每个元素又为一个指向另一段较大连续空间的首地址指针(缓冲区),缓冲区存放数据。
2、 数据结构:
template<class T,classAlloc=alloc,size_t BufSiz =0>
class deque{
public:
typedef T value_type;
typedef value_type* pointer;
typedef size_t size_type;
protected:
typedefpointer* map_pointer;
iterator start;
iterator finish;
map_pointer map;
size_type map_size;
}
3、 内存管理:
插入元素时,若需要增加内存,首先检查所插入的缓冲区是否还有备用节点,若没有,则再检查map是否还有空间,若还有则配置一个新的缓冲区,若没有,则需要重新配置新的map地址空间。
(四) stack
1、 特点:只允许从一端移除和新增值,以deque作为stack的缺省底层容器,不允许有遍历行为。
2、 示例:
3、也可以用list作为底层容器
定义:stack<int,list<int>> istack;
(五) queue
1、 特点:两端均可访问,但只允许在前段出,后端进。初首末端数据外,不能访问其他元素。以deque作为缺省的底层容器。
2、 示例:
3、也可以采用list作为底层容器,
定义:queue<int,list<int>> iqueue;
(六) heap
1、特点:分为max-heap和min-heap两种,数据排列成完全二叉树,前者每个节点的值都大于或等于其子节点的值,后者则小于或等于其子节点的值。其中max-heap中最大值在根节点,min-heap最小值在根节点。底层存储结构为vector或者array.
2、示例:
3、相关操作
Heap的插入和删除,同时还需要调整数据的存储位置,使之符合堆的各元素间大小关系的条件要求。
make_heap():将一段现有数据转换成heap
push_heap():加入新的元素到heap
pop_heap(): 将最大的点放入堆尾。并不移除。
sort_heap(): 将heap中数据从小到大排序,一旦排序则数据不符合heap结构。
(七) priority_queue
1、特点:基本特性跟queue一致,只有顶端的元素才能被外界取用。其中的元素并非依照被推入的顺序次序排列,而是通过max-heap操作,将元素按照权值从大到小排列。每次取值均为所有元素中的最大值。缺省情况以vector为底层容器。
2、示例:
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
intia[9]={0,1,2,3,4,8,9,3,5};
priority_queue<int>ipq(ia,ia+9);
cout<<ipq.size()<<endl;
for(inti=0;i<ipq.size();++i)
cout<<ipq.top()<<"";
cout<<endl;
while(!ipq.empty())
{
cout<<ipq.top()<<"";
ipq.pop();//移除底部的数据
}
cout<<endl;
return0;
}
结果:
(八) slist
1、特点:与list类似,但为单向链表。
2、示例: