vector

来源:互联网 发布:linux安装谷歌输入法 编辑:程序博客网 时间:2024/05/16 05:34

  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;}


 

原创粉丝点击