STL序列容器vector、deque、list和array学习笔记

来源:互联网 发布:heroku 域名 编辑:程序博客网 时间:2024/06/05 07:18

                   C++  STL序列容器vector、deque、list和array学习笔记

 

一、vector(矢量)

在头文件#include<vector>中定义的

vector是数组的一种类表示,它提供了自动内存管理功能,可以动态地改变vector对象的长度,并随着元素的添加和删除而增大和缩小。他提供了对元素的随机访问。在尾部添加和删除元素的时间是固定的,但在头部或者中间插入和删除元素的复杂度为线性时间。

    1.vector是序列容器类型,可以用begin()和end()分别指向容器元素的头和尾(end是指向对象的超尾元素,及对象中的最后一个元素的下一个位置)。

可以用一下方式输出对象中的值

void Show(const int & a)

{ cout<<a<<” ”;}

vector<int> vint={1,2,3,4,5,6};

for_each(vint.begin(),vint.end(),show);

输出结果就为:1 2 3 4 5 6 

2.vector还是可反转容器,增加了两个类方法:rbegin()和rend(),前者返回一个指向反转序列的第一个元素的迭代器,后者返回反转序列的超尾迭代器。可以这两个方法,反向输出数组的值,例如,如上定义的对象vint。

for_each(vint.rbegin(),vint.rend(),show);

输出结果就为:6 5 4 3 2 1

3.利用push_back()方法可以在vint的尾部添加元素,利用pop_back()可以在尾部删除元素。例如。

int input;

cin>> input;

vint.push_back(input);

vint.pop_back(input);

   4.vector可以对对象的元素进行排序:

sort(vint.begin(),vint.end());

   5.对vector可以使用下标的方式访问元素,即vint[n],就是访问vint对象的第n个元素。另外vint.at(n)功能和vint[n]相同。

 

 

二、deque(双端队列)

deque模板类在#include<deque>头文件中,表示是双端队列,在STL中,其实现类似于vector容器,支持随机访问。

deque和vector主要区别在于:

从deque对象的开始位置插入和删除元素的时间是固定的,而不像vector中那样是线性时间的。所以,如果多数操作发生在序列的起始和结尾处,则应考虑使用deque数据结构。

缺点:deque的数据结构比vector复杂,尽管二者都提供对元素的随机访问和在序列中部执行线性时间的插入和删除操作,但vector容器执行这些操作时速度要快些。

三、list(双向链表)

 list模板类包含在#include<list>中,list表示双向链表。除第一个和最后一个元素外,每个元素都与前后的元素相链接,这意味着可以双向遍历链表。

list和vector之间的关键区别在于:

     List在链表中任一位置进行插入和删除的时间都是固定的,而vector提供在尾部插入和删除时间是固定的,在其他位置的插入和删除是线性时间。因此,vector强调的是通过随机访问进行快速访问元素,而list强调的是元素的快速插入和删除。

 

list也是可反转容器,与vector不同的是,list不支持数组表示法和随机访问。

  list类独有的成员函数

void merge(list<T,Alloc>& x)

 说明:将链表x与调用链表合并。两个链表必须已经排序。合并后的经过排序的链表保存在调用链表中,同时x为空。复杂度为线性时间。

 

void remove(const T & val)

说明:从链表中删除val的所有实例。复杂度为线性时间。

 

void sort()

说明:使用<运算符对链表进行排序:N个元素的复杂度为NlogN

 

void splice(iterator pos,list<T,Alloc> x)

说明:将链表x的内容插入到pos的前面,x将为空。复杂度为固定时间。

 

void unique()

说明:将连续的相同元素压缩为单个元素。复杂度为线性时间。

四、array(数组)

 模板类array在头文件#include<array>中定义的,它并非STL容器,因为其长度是固定的。Array没有定义调整容器大小的操作。但定义了像operator[]()和at()操作,可以像普通数组那样利用下标进行元素操作。可将很多标准的STL算法用于array对象。例如copy()和for_each()。

array<int,5> aint  //定义了一个5个元素的int类型数组

0 0
原创粉丝点击