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.

 

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

posted on 2022-04-16 16:13  ReadyLoveMiku  阅读(125)  评论(0编辑  收藏  举报