stl 顺序容器vector(priority_queue),顺序容器List,顺序容器deque(queue, stack)详解

时间:2022-07-11 17:39:11

三种容器均支持resieze()操作,重新划定容器大小,且此函数有重载。

默认情况下:

queue,stack是基于deque实现的,priority_queue是基于vector实现的。

list是双向链表。

map是红黑树实现的


vector
基本操作:

vector<int> v;//定义一个空容器

vector<int> v1(v);//将v通过构造函数拷贝给v1

v.empty();//容器是否为空

vector<int>::iterator it = v.begin();//容器的首元素地址  [begin,end)

v.end();//容器的最后一个元素的下一个位置

v.rbegin();//逆序迭代器,指向容器的最后一个元素

v.rend();//第一个元素前面的位置

v.size();//容器v当前元素的个数

v.resize(n); //调整容器的长度大小,使其能容纳n个元素

v.resize(n,t);//调整大小的同时将新添加的元素的值都设为t

v.max_size();//返回容器可容纳的最多元素个数,返回类型为v::size_type

v.capacity(); //容器v的容量,会自动增长。通常大于size(),加倍分配存储空间。

v.reserve(n);//预留窗外的存储空间。

v.push_back(10);//将值10放入容器v 中

v.insert(p,t);//在迭代器p所指元素的前面插入值为t 的元素

v.insert(p,n,t);//在迭代器所指位置的前面插入n个值为t的元素

v.insert(p,b,e);//在迭代器p指向的元素前面插入迭代器b和e标记范围内的元素

v.at(1) = 20;// 相当于v[1] = 20;

v = v1;//删除v的所有元素,将v1的元素复制给v

v.assign(n,t);//将容器重新设置为存储n个值为 t 的元素

v.assign(b,e);//重新设置v的元素:将迭代器b,e范围内的所有元素复制到v中,b,e必须不是指向c中元素的迭代器

v.front() / v.back() //返回头元素,尾元素的引用

v.swap(v2);//交换两个容器,包括元素值,迭代器及大小等所有数据。比复制的操作快。

v.erase(p);//删除迭代器所指向的元素,它返回一个迭代器,指向被删除元素后面的位置。如果p指向元素的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。

v.erase(b,e);//删除迭代器b,e范围内的所有元素

v.clear();//删除容器中的所有元素

v.pop_back();//删除容器的最后一个元素


vectorbuilt-in数组类似,是一个在堆上建立的一维数组,它拥有一段连续的内存空间,并且起始地址不变,因此 它能非常好的支持随即存取,即[]操作符。vector因为存储在堆上,所以支持erase( ), resieze()(重新划分容器容量)等操作;vector不用担心越界当空间不够用的时候,系统会自动按照一定的比例(对capacity( )大小)进行扩充。在vector序列末尾添加(push_back( ))或者删除(pop_back( ))对象效率高,在中间进行插入或删除效率很低,主要是要进行元素的移动和内存的拷贝,原因就在于当内存不够用的时候要执行重新分配内存,拷贝对象到新存储区,销毁old对象,释放内存等操作,如果对象很多的话,这种操作代价是相当高的。为了减少这种代价,使用vector最理想的情况就是事先知道所要装入的对象数目,用成员函式reserve( )预定下来;vector最大的优点莫过于是检索(用operator[ ])速度在这三个容器中是最快的,

list

基本操作如deque;

 list的本质是一个双向链表(根据sgi stl源代码),内存空间不连续,通过指针进行操作。说道链表,它的高效率首先表现是插入,删除元素,进行排序等等需要移动大量元素的操作。显然链表没有检索操作operator[ ], 也就是说不能对链表进行随机访问,而只能从头至尾地遍历,这是它的一个缺陷。list有不同于前两者的某些成员方法,如合并list的方法splice( ), 排序sort( ),交换list的方法swap( )等等。

deque

基本操作继承所有ector,再加上push_front,pop_front();

 deque是一个double-endedqueue是由多个连续内存块构成,deque是list和vector的兼容,分为多个块,每一个块大小是512字节,块通过map块管理,map块里保存每个块得首地址。因此该容器也有索引操作operator[],效率没vector高。另外,dequevector多了push_front() & pop_front( )操作。在两端进行此操作时与list的效率 差不多

 

下面是选择顺序容器类型的一些准则  

1.如果我们需要随机访问一个容器则vector要比list好得多 

2.如果我们已知要存储元素的个vector 又是一个比list好的选择。  

3.如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector  

4.除非我们需要在容器首部插入和删除元素否则vector要比deque好。

5.如果只在容易的首部和尾部插入数据元素,则选择deque.

6.如果只需要在读取输入时在容器的中间位置插入元素,然后需要随机访问元素,则可考虑输入时将元素读入到一个List容器,接着对此容器重新拍学,使其适合顺序访问,然后将排序后的list容器复制到一个vector容器中