vector维护的是一个连续线性空间,所以不论元素型别为何,普通指针也都可以作为vector的迭代器来支持所需要的操作,如operator*, operator->, operator++, operator--, operator+, operator-, operator+=, operator-=。
如果客户端写出这样的代码:
vector<int>::iterator ivite; vector<Shape>::iterator svite;
由ivite的型别就是int*,svite的型别就是Shape*。
为了降低空间配置时的速度成本,vector实际配置的大小可能比客户端需求量更大一些,以备将来可能的扩充,这便是容量(capacity)的观念。换句话说,一个vector的容量永远大于或等于其大小。
一旦容量等于大小,又要添加新元素时,就要动态增加大小,但是并不是在原空间之后接续新空间(因为不能保证原空间之后沿有可供配置的空间),而是以原大小的两倍另外配置一块空间,然后将原内容拷贝过来,然后才开始构造新元素并释放原空间。因此,对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了!
vector有两个迭代器start和finish分别指向连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(包含备用空间)的尾端。
使用begin()和end()可以获取已被使用的头、尾迭代器(注意STL的“前闭后开”的区间要求)。
使用size()获取已经使用的元素个数,使用capacity()可获取容量(包含备用空间在内,可以存储的元素个数)。
使用push_back()或insert()添加元素,pop_back()或erase()移除元素,clear()清空所有元素。
添加元素的过程相对比较复杂,因为考虑到动态增加空间。移除元素时就简单一些,而且移除元素后不会缩小vector的容量。
三个移除元素的函数如下:
void pop_back() { --finish; // finish是前面说过的指向已使用空间尾部的迭代器 destroy(finish); // destroy是全局函数 } iterator erase( iterator first, iterator last) { iterator i = copy(last, finish, first); // copy是全局函数 destroy(i, finish); finish = finish - (last - first); return first; } iterator erase(iterator position) { if(position + 1 != end()) copy(position + 1, finish, position); --finish; destroy(finish); return position; }