zoukankan      html  css  js  c++  java
  • 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?

  • 相关阅读:
    Object类入门这一篇就够了!
    什么是Java内部类?
    Spring Cloud Alibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)
    Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现
    Spring Cloud Stream同一通道根据消息内容分发不同的消费逻辑
    Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)
    Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
    Spring Cloud Stream消费失败后的处理策略(二):自定义错误处理逻辑
    Spring Cloud Stream消费失败后的处理策略(一):自动重试
    Spring Cloud Stream如何消费自己生产的消息?
  • 原文地址:https://www.cnblogs.com/sld666666/p/1775276.html
Copyright © 2011-2022 走看看