• C++ STL 源码学习


    ------------恢复内容开始------------

    P2

      1.container 需要有allocator帮助分配内存,即每种container都得搭配一个allocator

      2. container.begin() 表示容器第一个元素的起始地址(指向第一个元素)

        container.end()   表示最后一个元素之后下一个元素的起始位置【*(container.end()) = 垃圾内存】

       综上iterator 本身类似一个指针(可能本质就是指针实现的) 可以(*,->,++,--)  

       iterator本身是一个smart pointer【pointer like class】

    P3 

      1. Vector 只有一端可扩充,pushback()静态数组实现,每次是两倍扩展(2,4,8,16.....)

      3. Associative containers: set(key)/multiset.  (key:value)map/multimap 底部都是红黑树实现

      4. multi-表示key值是否可重复

      unordered container(hashtable实现) 一般是链式冲突解决法

    P5  <List> C++ 的list是双向链表且是环状的实现。单向链表是forward—list

      1. 全局sort VS 容器自带sort

      2. 提供 push_back & push_front

      <forward-list>:

      3. only push_front //Prepends the given element value to the beginning of the container.

      4. slist(GNU 独有) ===== forward-list

      <deque双端队列> 分段连续,段间离散,段内连续(有次序)

      deque-->可以重构成 stack & queue【更像是deque的adapter】

      因为deque有 push_front[back] 以及 pop_front[back]顾可以提供stack与queue 的所有操作。

      

     

     P 10 Allocator

      ::operator new , ::Operator delete最终都是C的malloc和free来分配内存 

      GNU2.9 alloc类:存在一个数组[0]->[15] [0]每个元素8个字节,[1]每个元素占16...8的倍数递增下去,导致每次为多个元素分配空间时,头部的cookie个数减少。

      GNU4.9 allocator类 

    P 11 容器之间的关系

      array,vector--->都是连续的空间(静态数组实现)。 priority_queue 中composite 一个heap 而heap则composite 一个 vector(基础都是vector)

      set,map,multiset,multimap -> 中含有rb_tree 为复合关系 。 hash_set, hash_map ==unordered_set , unordered_map

      deque(分段连续空间) stack,queue中都含有一个双端队列.

      一般容器的iterator都需要 重载++ -- * -> 这4个操作符重载

      

      postfix form  = i++(后置)先用再移动 

      prefix form = ++i (前置)先移动再用

    P13 list(本质是一个前闭后开双向链表,之所以要成环状,是为了begin()和end()判断空和满逻辑要不同)

       begin指向当前表头,end指向尾部元素的下一个

     iterator萃取器【iterator_traits】:用于返回该容器的一系列属性:iterator_category(指针的移动性质指针向前与向后),difference_type(当需要知道两iterator之间的距离时该用哪种数据类型表示 一般unsigned int),value_type(容器的元素类型),reference,pointer。

     所以iterator就需要5种associated types!  但前提只有struct(iterator) 和 class这种能够提供typedef的才可以通过classname直接萃取回答。

     如果对象是一个native pointer的话

    函数指针 (与数组类似函数的名字就是指向该函数的指针)

    函数指针的定义方式

    data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn);

    例如:

    1.int (*fp)(int a); // 这里就定义了一个指向函数(这个函数参数仅仅为一个 int 类型,函数返回值是 int 类型)的指针 fp。
    2.int RecallFunc(int *start, int *end, bool (*pf)(int)) // 定义指向函数(返回值 为bool型,参数只有一个为int)的指针pf.

    ------------恢复内容结束------------

  • 相关阅读:
    oracle“记录被另一个用户锁住”
    Oracle CASE WHEN 用法介绍
    拥有机器人的人生会是怎样的体验?
    需求那么多,核心需求都从哪里来?
    一文读懂互联网及电商逻辑
    读书:《敏捷产品--不确定性的思维革命》
    读书:《超越感觉:批判性思考指南》一
    618啦,你的钱包又被盯上啦!
    产品经理如何开启上帝视角?
    我的产品经理价值观
  • 原文地址:https://www.cnblogs.com/LuoRuidiLoveMiku/p/16153208.html
Copyright © 2020-2023  润新知