• 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?

  • 相关阅读:
    iot 表索引dump《2》
    heap表和iot表排序规则不同
    Cannot complete the install because one or more required items could not be found.
    iot表输出按主键列排序,heap表不是
    iot 表主键存放所有数据,且按数据插入顺序排序
    iot表和heap表排序规则不同
    org.eclipse.graphiti.ui.editor.DiagramEditorInput.
    Oracle 排序规则
    perl 异步超时 打印错误
    14.6.3 Grouping DML Operations with Transactions 组DML操作
  • 原文地址:https://www.cnblogs.com/sld666666/p/1775276.html
Copyright © 2020-2023  润新知