顺序性容器(vector&list&deque)

来源:互联网 发布:python spark视频教程 编辑:程序博客网 时间:2024/06/06 01:08

引言


(1)vector向量相当于一个数组


   在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。

   优点:(1) 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组进行动态操作。通常体现在push_back() pop_back()


         (2) 随机访问方便,即支持[ ]操作符和vector.at()


         (3) 节省空间。


   缺点:(1) 在内部进行插入删除操作效率低。


         (2) 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。


         (3) 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放


(2)list 双向链表



   每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。


   优点:(1) 不使用连续内存完成动态操作。


         (2) 在内部方便的进行插入和删除操作


         (3) 可在两端进行push、pop


   缺点:(1) 不能进行内部的随机访问,即不支持[ ]操作符和vector.at()


         (2) 相对于verctor占用内存多


(3) deque  双端队列 double-end queue



    deque是在功能上合并了vector和list。


    优点:(1) 随机访问方便,即支持[ ]操作符和vector.at()


          (2) 在内部方便的进行插入和删除操作


          (3) 可在两端进行push、pop


    缺点:(1) 占用内存多


使用区别:


     1)如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector

     2)如果你需要大量的插入和删除,而不关心随机存取,则应使用list

     3)如果你需要随机存取,而且关心两端数据的插入和删除,则应使用deque


     

vector的使用


基本操作:


(1)头文件#include<vector>.
(2)创建vector对象,vector<int> vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
    cout<<*it<<endl;
(6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear();
(10)定义排序比较函数:
bool Comp(const int &a,const int &b)
{
    return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。


list的使用


基本操作


(1)assign() 给list赋值 
(2)back() 返回最后一个元素 
(3)begin() 返回指向第一个元素的迭代器 
(4)clear() 删除所有元素 
(5)empty() 如果list是空的则返回true 
(6)end() 返回末尾的迭代器 
(7)erase() 删除一个元素 
(8)front() 返回第一个元素 
(9)get_allocator() 返回list的配置器 
(10)insert() 插入一个元素到list中 
(11)max_size() 返回list能容纳的最大元素数量 
(12)merge() 合并两个list 
(13)pop_back() 删除最后一个元素 
(14)pop_front() 删除第一个元素 
(15)push_back() 在list的末尾添加一个元素 
(16)push_front() 在list的头部添加一个元素 
(17)rbegin() 返回指向第一个元素的逆向迭代器 
(18)remove() 从list删除元素 
(19)remove_if() 按指定条件删除元素 
(20)rend() 指向list末尾的逆向迭代器 
(21)resize() 改变list的大小 
(22)reverse() 把list的元素倒转 
(23)size() 返回list中的元素个数 
(24)sort() 给list排序 
(25)splice() 合并两个list 
(26)swap() 交换两个list 
(27)unique() 删除list中重复的元素


deque的使用


基本操作


(1)    构造函数
deque():创建一个空deque
deque(int nSize):创建一个deque,元素个数为nSize
deque(int nSize,const T& t):创建一个deque,元素个数为nSize,且值均为t
deque(const deque &):复制构造函数
(2)    增加函数
void push_front(const T& x):双端队列头部增加一个元素X
void push_back(const T& x):双端队列尾部增加一个元素x
iterator insert(iterator it,const T& x):双端队列中某一元素前增加一个元素x
void insert(iterator it,int n,const T& x):双端队列中某一元素前增加n个相同的元素x
void insert(iterator it,const_iterator first,const_iteratorlast):双端队列中某一元素前插入另一个相同类型向量的[forst,last)间的数据
(3)    删除函数
Iterator erase(iterator it):删除双端队列中的某一个元素
Iterator erase(iterator first,iterator last):删除双端队列中[first,last)中的元素
void pop_front():删除双端队列中最前一个元素
void pop_back():删除双端队列中最后一个元素
void clear():清空双端队列中最后一个元素
(4)    遍历函数
reference at(int pos):返回pos位置元素的引用
reference front():返回手元素的引用
reference back():返回尾元素的引用
iterator begin():返回向量头指针,指向第一个元素
iterator end():返回指向向量中最后一个元素下一个元素的指针(不包含在向量中)
reverse_iterator rbegin():反向迭代器,指向最后一个元素
reverse_iterator rend():反向迭代器,指向第一个元素的前一个元素
(5)    判断函数
bool empty() const:向量是否为空,若true,则向量中无元素
(6)    大小函数
Int size() const:返回向量中元素的个数
int max_size() const:返回最大可允许的双端对了元素数量值
(7)    其他函数
void swap(deque&):交换两个同类型向量的数据
void assign(int n,const T& x):向量中第n个元素的值设置为x

原创粉丝点击