------------恢復內容開始------------
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++(后置)fetch and increment ---->多載 operator++(int) return { self temp = *this; ++*this ; return temp; } //old value {return by value} ->不提供 i++++
prefix form = ++i (前置)增加然后取回值 ------>多載 operator++() return { return (*this)++ ; }. //{return by reference} -> 提供 ++++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的話則無法直接通過類名訪問,而是通過增加中間層(即iterator-萃取機)(提供偏特化在遇到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.
------------恢復內容結束------------
P 14 vector(size = 12bytes 三根指標)【前閉后開】

front vs begin //一個回傳數值(reference)一個回傳指標(iterator)
back vs end //一個回傳數值(reference)一個回傳指標(iterator)
vector's iterator 本質就是一個指標
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/469802.html
標籤:其他
