C++
语言本身提供了一个序列式容器
array
,
array
是
静态空间,一旦配置了就不能改变,类似于
C
语言的
数组。
vector
的数据安排以及操作方式与array
很像,但vector
是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。
vector的迭代器
vector
的嵌套型别定义如下:
template <class T, class Alloc = alloc>
class vector {
public:
typedef T value_type;
typedef value_type *pointer;
typedef value_type *iterator; // vector的迭代器是普通指针
typedef value_type &reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
};
alloc
是SGI STL
的空间配置器。
vector
维护的是一个连续线性空间,因此不论其元素型别如何,普通指针都可以作为vector的迭代器而满足所有必要条件,因为vector
迭代器所需要的操作行为,如operator*
、operator->
、operator++
、operator--
、operator+=
、operator-=
,普通指针天生都具备,所以vector
提供的是Random Access Iterators
。
vector<int>::iterator ivite; // ivite的类型是int*
vector<Shape>::iterator svite; // svite的类型是Shape*
vector的数据结构
vector
采用线性连续空间存储数据,它以两个迭代器start
和finish
分别指向配置得来的连续空间中已被使用的范围,并以迭代器end_of_storage
指向整个配置空间的尾端。
template <class T, class Alloc = alloc>
class vector {
protected:
iterator start; // 目前使用空间的头
iterator finish; // 目前使用空间的尾
iterator end_of_storage; // 目前可用空间的尾
};
当
finish
等于end_of_storage
时,便是满载。下次再新增元素时,整个vector就得另觅居所。
如图所示,vector
里保存了6个整型,已配置但未使用的空间里可以再存放两个元素。
使用这三个迭代器,便可轻松访问vector的元素,获取vector的容量和大小。
template <class T, class Alloc = alloc>
class vector {
public:
iterator begin() {
return start; }
iterator end() {
return finish; }
size_type size() const {
return size_type(end(