zoukankan      html  css  js  c++  java
  • (一)STL体系结构基础介绍

    一、STL六大部件

      容器(Containers):存放元素,内存由分配器搞定

      分配器(Allocator):支持容器的内存分配

      算法:操作容器元素的函数。与OO不同(面向对象将元素与函数放到一个类里),GP(模板编程)将数据放入容器,操作方法放入算法中。

      迭代器(Iterator): 算法和容器之间的桥梁,通过迭代器,算法才能去操作容器中的元素。迭代器就是泛化的指针。

      适配器(Adapters):对其他组件进行转换。

      仿函数(Functors):自定义类的相关操作(比如自定义类A,计算其两个实例的相加、相减等,即操作符重载)。

    二、一个例子使用六大部件

      通常allocator那部分不用写。

            

    三、容器遍历

      前闭后开区间

      

      使用auto,for遍历

      

      auto的其他用法

       

    四、容器结构与分析

      1、顺序容器

      Array:固定大小,连续空间存放

      Vector: 当容量不够时,allocator在背后重新分配

      Deque: 双端队列

      List: 双向链表

      ForwardList:单向链表

      

      2、关联容器(包括Unordered_Containers)

      

      关联容器的查找很快

      Map/Set:一般用红黑树实现(左右高度平衡的二叉树)

      MultiMap/MultiSet: key可重复的。

      Map是key-value,Set是key-key。

      无序容器:元素存放的位置是不固定的,由hash-table实现(目前最好的实现方式是seperate chaining)。

    五、容器使用

      1、编码习惯

         (1)为每个独立的程序创建namesapce;

         (2)  在用到变量时才定义变量,但不缩进;

      2、vector

        (1)因为单向,只能通过push_back存放元素(从头存放需要移动整个vector);

        (2)   当空间不足,重新分配内存时,内存两倍增长;

        (3)可以通过front,back访问首尾元素,data访问首地址(vector, array, list);

      3、List

         标准库有sort,各个容器也有自带sort,排序尽量用自带的sort。每次扩充一个结点,空间利用率高

     4、forwad_list

          (1)压入元素用的是push_front(其他用的都是push_back);

        (2)只有front访问首元素(back,size都不提供);查找较慢。

       5、deque

       (1)内存分段连续(由buffer构成,每个buffer是连续的),当内存不够时,重新分配一个buffer。 

       (2)没有自带的sort,只能使用全局的sort

       

       6、stack、queue

        内部都是通过deque来实现,一个后进先出,一个先进先出(不提供iterator)。有人也称之为容器的适配器(Adapter)

          

      7、multiset/multimap

      (1)通过insert插入元素(会慢一点),有自带的find进行查找(很快)

      (2)multimap: c.insert(pair<int, string>(i, buf)),不能使用c[i]来进行插入(key可能重复)

      (3)查找时(*item).first为key,second为value

     8、unordered_multiset/unordered_multimap

          哈希表实现

     9、map

          可通过m[i]=c来插入,内部会形成pair<>(i, c)来进行插入 

    七、在双向链表下,使用不同的分配器

      直接使用容器(有默认分配器),不要使用分配器分配内存;有小量内存分配需求时,可以使用new/malloc,不要直接使用分配器

    八、总结

     

  • 相关阅读:
    python爬虫 --- 简书评论
    python 爬虫 伪装
    pygal的简单使用
    anaconda安装不存在的包
    python爬虫 赶集网
    my.conf 修改编码
    python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删改查操作
    基于visual Studio2013解决C语言竞赛题之1021九九乘法表
    基于visual Studio2013解决C语言竞赛题之1020订票
    基于visual Studio2013解决C语言竞赛题之1019填数
  • 原文地址:https://www.cnblogs.com/573177885qq/p/9933469.html
Copyright © 2011-2022 走看看