STL中的vector

    在上一篇中,我分析了nginx中的动态数组, 作为对比这里再分析一下SGI STL

中的动态数组(vector)。

    在开篇之前想借此文大家一个问题,STL在大家的工程中用得多吗?本人现在的

公司C++的代码都是用MFC开发的,公司项目也算比较多的,但是在开发过程中用

上标准库的真的不太多!?

1. vector 源代码分析

    STL中的vector也可以认为是对array的包装和升级。

    - vector 在其内部保持着一个原始的数组(一块连续的内存区域),但是提供了计算size,capacity,以及

       动态扩展的能力。

    - vector 可以认为是一种全新的数据类型,所以必须重载=, []等运算符

    - 提供了push_back, pop_back,clear,erase, resize等操作元素的能力

    - 提供empty , size,capacity等判断内部元素的能力

    - 支持迭代

1.1 vector的属性

    在vector中定义了三个成员变量,代码如下:

 

 

其中 m_finish – m_start 就等于这个vector的size,

m_end_of_storage – m_start就等于这个vector的capacity。

1.2 vector的构造

    vector支持五种类型的初始化化, 所以它就必须有5个构造函数:

 

 

    在这里, 我为了代码的简单, 去掉了STL中从alloc分配内存的动作, 而直接用new delete,

这样管理内存,性能当然很差了, 但是用来说明vector却足够了, 所以uninitialized_copy

和uninitialized_fill_n 函数 我也仿造STL中从新写了一个, 不然的话光是内存分配的动作就能

拉出一大堆的代码。下面是我仿造的几个函数:

 


  这样我们就可以写下如下的测试代码了:

 

 

 

1.3 vector的元素的迭代

     vector必须支持迭代功能,说到迭代功能,不得不说下STL种的迭代器。

迭代器中STL中扮演着很重要的角色. STL的核心思想就是:将数据结构和算法分离。

而迭代器就是作为数据结构和算法的粘合层而存在的。在STL中,每一个容器而有一个自己

的迭代器, 而vector的迭代器就是一个普通的指针。所以在vector中实现迭代功能就非常

的简单了。代码如下:

 


然后调用的使用只需:

 

 

 

1.4 vector的元素判断

    vector 提供了计算大小, 容量, 是不是空 等一系列的判断,实现起来也非常简单:

 

 

 

1.5 vector的运算符

   在使用vector的时候,可以吧它认为是一种全新的数据类型, 所以[], ==, != , <= 等运算符

的重载是必须的。首先我们看下它是如何进行[]和= 的:

 

 

有了实现我们就可以这样使用它了:

test0 = test1;
std::cout<<test0[2]<<endl;

 

然后我们在来看下几个比较运算符的实现:

 

 

实现起来非常简单了。

1.6 vector的元素的操作

    vector的元素的操作非常多, 这里我就选取其中典型的几个来分析下:

 


这几个函数的实现也比较简单, 以 push_back 为例子, 首先它会判断此容器的容量是不是满了, 如果慢了

则需要重新申请内存了, 如果还没有满 则增加一个值吗, 然后调整m_finish的位置。而pop_back, 则刚好

相反,减少一个值,然后改变m_finish的位置。

 

2. 小结

    vector的原理简单, 但是实现起来就复杂了。复杂度和功能是成正比的, STL的野心是很庞大的,导致了

内部实现的代码就复杂了。 不过话说回来,C 语言的哲学理念是:Kiss(keep it simple stupid)(武断,错误,

或者应该更正为simple,但是这里不改了)。 但是C++ 的 哲学理念是什么呢?Perfect?Complex?All-purpose?

posted @ 2010-07-11 17:18  sld666666  阅读(3154)  评论(5编辑  收藏  举报