阅读STL源码剖析笔记 —— vector

来源:互联网 发布:守望先锋显卡优化 编辑:程序博客网 时间:2024/05/19 05:06

初步阅读vector 的摘要源码,我找到了一些我觉得挺重要的东西,在STL源码剖析里面,vector 的实现中有这么几个函数:


void push_back(const T& x){       if (finish != end_of_storage)  //finish 是我们经常用的end()函数返回的迭代器,end_of_storage 也是一个迭代器,表示可用空间的尾       {            construct(finish,x);        //这个全局函数作用就是将初值设定到指针所指的空间上            ++finish;       }       else       {            insert_aux(end(),x);     //这个函数是一个vector里面的成员函数,作用应该是在特定的位置插入元素;       }}iterator erase(iterator position)       {       if (position + 1 != end())       {           copy(position + 1, finish, position);       }       --finish;       destroy(finish);            //这个全局函数就是将指针所指的东西析构掉;       return position;}


1.       从上面的push_back 函数并没有看出vector对空间分配的特性:假如可用空间已满,那么就额外分配出基于当前元素个数的空间以便之后的插入/添加元素的操作

   (/*额外分配元素个数依据不同的编译器来确定*//*或者根据代码?*/),我猜想应该是在insert_aux(iterator position)[上面没写出来] 这个函数里面会解决空间的分配,然而摘要源码

      里面并没有给出这个函数的实现,只能放一放。


2.        第二个函数:erase,这个函数是我们经常用到的函数之一,是删除迭代器指定位置的元素,有2种重载版本可供我们使用,我就先理解一下只接受一个迭代器的版本吧:

            过程   : 判断是否是最后一个元素->所有元素前移一位->末端迭代器自减-> 返回传入函数的迭代器。

    我记得,在 《C++ Primer》一书中,作者就警告我们说,erase操作会使迭代器失效,这个函数会返回指向后面一个元素的迭代器,但是在这个函数里面并没有对原本迭代器作任何的改变(因为传进来的不是引用),感觉这个迭代器的副本只是为了记录所指向的位置,而经过copy之后,这个位置正好是原来容器中后面一个元素所占用的位置,然后再把这个指针当作返回值返回,那么可否看作是返回指向后面一个元素的迭代器的假象呢?(求高人指点)

反正感觉弄不懂的话,那么用erase函数的时候记得《C++ Primer》中说的就好 ——返回指向下一个元素的迭代器


3.对vector 的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了


如果有不对的地方,欢迎指正!



0 0