对于基本容器,可以通过增加条件来对其进行改进。序列就是一种重要的改进。deque、list、queue、priority-queue、stack和vector这六种容器均为序列式容器。
序列式容器 是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。这个位置和元素本身无关,而和操作的时间和地点有关,顺序性容器不会根据元素的特点排序而是直接保存了元素操作时的逻辑顺序。比如我们一次性对一个顺序性容器追加三个元素,这三个元素在容器中的相对位置和追加时的逻辑次序是一致的
vector
vector是定义于名称空间(namespace)std内的模板,其定义在头文件<vector>中。
其原型为:
template<class T,c1ass Allocator=allocator<T>>
class vector
{
...
}
vector中的元素可以是任意型别T,必须具备可设置和可复制两个属性。模板的第2个参数是关于空间配置器设置的,用于定义内存模型,其默认内存模型是C++STL提供的allocator,对于一般应用来说,不需考虑。
C++标准并未规定必须以动态数组来实现vector,仅规定了相应的条件和操作复杂度。在程序开发过程中,使用vector作为动态数组是非常方便的。vector的迭代器是随机存取迭代器,对任何一个STL算法均奏效。尤其在容器末端或删除元素时,vector性能相当好。
vector<bool>
STL专门为bool的vector版本做了特殊优化,内存占用更少,一个元素占用1bit,因为是字节寻址所以在reference和iterator操作时做了特殊处理,因此速度比普通的vector较慢,所有元素操作必须转换为bit操作,应优先使用bitset。
提供了filp()函数对vector<bool>取反操作。
list
list是采用双向链表实现的容器。每个节点存储一个元素,支持前后两个方向移动元素。无法随机访问元素。元素的移动、删除、插入操作比vector高效得多。
- list不支持随机存取。
- 在list的任何位置执行元素的插人和移除都非常快,可以迅速实现。插人和删除动作不会影响指向其他元素的指针、引用、迭代器,不会造成失效。
- list不提供下标操作符[]和at()函数。
- list没有提供容量、空间重新分配等操作函数,每个元素都有自己的内存。
- list也提供了特殊成员函数,专门用于移动元素。和同名的算法相比,使用这些函数速度更快。
#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
template<typename T>
void print(list<T>& mylist)
{
typename list<T>::iterator Iter;
mylist.reverse();
for(Iter = mylist.begin(); Iter != mylist.end(); Iter++){
cout << *Iter << ", ";
}
cout << endl;
}
int main()
{
list<double> list_One, list_Two, list_Three;
double Ele = 0.0;
for(int i = 0; i < 10; i++){
Ele = i + i /10.0;
list_One.push_front(Ele);
}
cout << "list_One: ";
print(list_One);
list_Two.assign(5, 5.6);
cout << "list_Two: ";
print(list_Two);
list_Three.assign(list_One.begin(), list_One.end());
cout << "list_Three: ";
print(list_Three);
}
deque
- deque可以快速插入和删除两端元素,而vector只提供push_back和pop_back。
- 存取元素时,deque容器会稍慢
- deque容器的迭代器是智能型指针