template <class T, class Alloc = alloc> class vector { public: typedef T value_type; typedef value_type* iterator; //vector 的迭代器是普通指针 ... };
所以根据上述定义,如果客户端写出这样子的代码
vector<int>::iterator ivite;
vector<Shape>::iterator svite;
ivite的类型其实就是int*,svite的类型其实就是Shape*。
vector 所采用的数据结构非常简单:线性连续空间。它以两个迭代器 start和 finish 分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage 指向整块连续空间(含备用空间)的尾端:
template ‹class T, class Alloc = alloc> class vector { ... protected: iterator start; // 表示目前使用空间的头 iterator end; // 表示目前使用空间的尾 iterator end_of_storage; // 表示目前可用空间的尾 ... };
为了降低空间配置时的速度成本,vector 实际配置的大小可能比客户端需求量更大一些,以备将来可能的扩充。这便是容量(capacity)的观念。换句话说,一个vector 的容量永远大于或等于其大小。一旦容量等于大小,便是满载,下次再有新增元素,整个 vector 就得另觅居所。
也就是说将原来的内容拷贝过来。通过如果是内置数据类型,那么就是简单执行了memmove
inline char* uninitialized_copy(const char* first, const char* last, char* result) { memmove(result, first, last - first); return result + (last - first); }
如果非内置的数据类型则要把旧内存块的对象的值通过拷贝构造函数拷贝到新的内存块上来。
template <class InputIterator, class ForwardIterator> ForwardIterator __uninitialized_copy_aux(InputIterator first, InputIterator last, ForwardIterator result, __false_type) { ForwardIterator cur = result; __STL_TRY { for ( ; first != last; ++first, ++cur) construct(&*cur, *first); return cur; } __STL_UNWIND(destroy(result, cur)); }
补充:
resize(int n):重新申请并改变当前vector对象的有效空间大小
reserve(int n):重新申请并改变当前vector对象的总空间(capacity)
1、vector不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector类型的每一种都指定了其保存元素的类型。因此,vector和vector都是数据类型。
而vector::iterator,vector相当于iterator的命名空间,vector::iterator ivite 转换后就是int* vite
struct MyObj { typedef int WORD32; }; int main() { MyObj::WORD32 a = 10; cout << a << endl; return 0; }
2、vector() 则是一个临时的对象。