zoukankan      html  css  js  c++  java
  • 《STL源码剖析》笔记

    STL六大组件 
    1.容器(container):各种数据结构,如vector,list,deque,set,map等
    2.算法(algorithm):各种常用算法如sort,search,copy,erase等
    3.迭代器(iterator):扮演容器与算法之间的胶着剂。所以STL容器都附带有自己专属的迭代器。指针也是一种迭代器。
    4.仿函式(functors):行为类似函数,可作为算法的某种策略,从实现的角度讲,仿函式是一种重载了operator()的class或class template。
    5.适配器(adaptor):一种用来修饰容器或仿函式或迭代器接口的东西,有function adaptor,container adaptor,iterator adaptor。
    6.分配器(allocator):负责空间分配与管理。

    auto_ptr
    auto_ptr在构造时获取对某个对象的所有权(ownership),在析构时释放该对象。我们可以这样使用auto_ptr来提高代码安全性:

    int* p = new int(0);
    auto_ptr<int> ap(p);
    

    从此我们不必关心应该何时释放p,也不用担心发生异常会有内存泄漏。

    但1)auto_ptr不能共享所有权,即不要让两个auto_ptr指向同一个对象。2)auto_ptr不能指向数组,因为auto_ptr在析构的时候只是调用delete,而数组应该要调用delete[]。

    allocator配置器
    SGI设计了双层级配置器,第一级配置器直接使用malloc()和free(),第二级配置器则视情况采用不同的策略:
    1.申请的内存大于128B,此时用的是普通的malloc和free;
    2.小于128B的采用memory pool整理方式:从一个特殊的链表上获取,链表上挂着不同大小的可利用内存块,这些块是从内存池中获取的,内存池是事前分配的,不够了会向系统再申请。
    对于方式1,free了以后就释放了,对于方式2,释放了以后是还给了这个特殊的链表。

    容器
    http://blog.csdn.net/gzzheyi/article/details/8649108

    heap内含一个 vector,priority-queue内含一个heap、stack和queue都内含一个deque,set/map/multiset /multimap 都内含一个RB_tree,hash_x 都内含一个hashtable。
    红黑树:根到叶子节点的最长路径不多于最短路径的两倍,平衡。

    vector
    vector采用线性连续空间。它以两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端(vector本身就是内含这三个东东):

    list的迭代器:
    由于STL list是一个双向链表(double linked-list)。

    deque
    deque系由一段一段的定量连续空间构成。一旦有必要在dequer前端或尾端增加新空间,便配置一段定量连续空间,串接在整个deque的头端或尾端。deque采用一块所谓的map作为主控。这里所谓map是一小块连续空间,其中每个元素(此处称为一个节点,node)都是指针,指向另一段(较大的)连续线性空间,称为缓冲区。缓冲区才是deque的储存空间主体。

  • 相关阅读:
    git merge & git rebase 你用哪一个?
    [牛客题霸-高频算法面试题]一样的水
    [牛客题霸-高频算法面试题]那些插队的人
    解决ionic5多个模态关闭一个其他不显示的问题
    Selenium面试题+答案
    记删除AlibabaProtect.exe的经历
    免费的接口数据测试API
    删除重复的电子邮箱-leetcode
    firewall命令行详解
    将群晖恢复到出厂设置
  • 原文地址:https://www.cnblogs.com/lautsie/p/3407587.html
Copyright © 2011-2022 走看看