关于几个常用容器类型的比较
初学数据结够,总是不能准确区分几个常用的容器类型,于是在这里将它们做以下比较。
常用的容器类型主要有数组、向量、双端队列和表。由于数组较为熟悉,所以在这里不作说明。
一、 向量(vector)。向量是一维数组的类版本。它相比于数组来说的主要优点是可以根据需要动态地增加内存大小。向量的主要方法如下:
1、 push_back(const T& x)
2、 insert(iterator position,const T& x)
3、 pop_back()
4、 erase(iterator position)
5、 erase(iterator position,iterator position
6、 size()
7、 empty()
8、 begin()
9、 end()
10、 front()
11、 operator [](unsigned n)
向量是一个项的有限序列,满足:
1) 在常数时间内,可以随机访问或修改该下标对应的项。
2) 在序列尾部进行的插入操作平均来说耗费常数时间,但是worstTime(n)是O(n)(当序列为满的时候插入,耗费时间与n成线性关系)。
3) 对序列尾部进行的删除,worstTime(n)是常数时间。
4) 任意位置的插入和删除,worstTime(n)和averagrTime(n)均耗费常数时间。
二、 双端队列(deque)。双端队列除了具有vector的所有特征与方法外,还具有push_front(const T& x)和pop_front()方法。即它的前端插入与删除操作和后段插入、删除一样平均只耗费常数时间。
三、 表(List)。表也是一个项的有限序列,它具有下列特征:
1) 访问或修改序列中的任意项耗费线性时间。
2) 给出序列某一位置的迭代器,在这个位置上插入或删除一个项需要花费常数时间。
表的常用方法如下:
1、push_back(const T& x)
2、insert(iterator position,const T& x)
3、pop_back()
4、erase(iterator position)
5、erase(iterator position,iterator position
6、size()
7、empty()
8、begin()
9、end()
10、splice(iterator position,list<T>& x)
11、sort()
造成表与向量和双端队列具有不同特征的原因是表是一个链接存储结构而向量和双端队列是连续存储结构,并且链表迭代器不是随机访问器,而只是双向迭代器。
四、 总结。
1、 双端链表相比向量的好处:
1) 调整大小时没有项的移动。
2) 增添了push_front和pop_front方法。
3) 在双端队列里,未使用的块将被回收。而向量只会增长,不会缩短。
4) 对内部的插入和删除,双端队列的移动次数较少。
2、 双端链表相比向量的缺点:
双端队列需要模算法将下标转换成地址。
3、 一般情况下,向量快于双端队列。
4、 链表方法和向量或双端队列方法的差别:
1) list类没有下标运算符[],缺乏随机访问性。
2) 链表中插入或删除一个迭代器所在位置上的项只需要常数时间,而在向量或双端队列中却需要线性时间。
3) 链表中的插入和删除只会使直接相关的迭代器失效,但vector和deque的插入和删除操作却会使在操作项之后的所有项都会失效。