C 學習7 深入STL 1

2021-07-28 03:34:48 字數 3891 閱讀 3899

in vc stl

template >

class vector;

template> list ;

template> deque;

template> set;

templateclass allocator

void deallocate (void _farq *_p,size_type)

};...

#ifndef _farq

#define _farq

#define _pdft ptrdiff_t

#define _sizt size_t

#endif

templateinline _ty _farq *_allocate(_pdft _n,_ty _farq*)

operator new /delete 分別呼叫 malloc/free

gcc2.9 中容器的預設分配器為alloc 其實現為記憶體池gcc4.9 改為上述。alloc重新命名為 _pool_alloc<_class _tp>

sizeof(std::allocator) = 1

sizeof(__gnu_cxx::array_allocator) = 8 含有乙個ptr指向array和乙個size_t

array,vector,deque均是連續儲存空間有randomaccessiterator 可以operator

list /forwaord——list 是鍊錶結構set/multiset,map/multimap 是樹型結構一般由紅黑樹實現。

unsorted set/multiset, unsorted map/multimap :由hashtable 實現。

};可見list 有乙個雙向鍊錶構成。雙向鍊錶的結尾有乙個空白節點用於保證[..) 特性end() 迭代器指向此位置。當你對某個type實施operator->,而該type 不是built-in ptr時,編譯器會找出user-defined 哦perator-〉並將它施行於該type之後,一直如此迭代直到觸及 a pointer to a built-in type 然後進行成員訪問。

iterator作為連線演算法與容器的紐帶 iterator 需要回答演算法三個問題

1. iterator_category()

2. difference_type

3. value_type

其實按c++標準還有兩個reference 和pointer

template struct __list_iterator

;templateinline void

algorith(i first, i last)

可見對於乙個通用演算法 需要知道上述5 個問題。 一般來講iterator 為class時都可以直接提取。但是當iterator 不是乙個類時就需要乙個中間層來來萃取這5個特徵 即iterator_trait

template struct iterator_traits  ;

偏特化1.

tempalte t>

struct iterator_traits ;

偏特化2.

template t>

struct iteratort*> ;

//於是當需要知道 i 的value_type 時可以:

template...>

void algorithm(...)

//完整的iterator_traits

template struct iterator_traits ;

//partial for regular pointers

templatet>

struct iterator_traits ;

//partial speciallization for regular const pointers

template t>

struct iterator_traitst*>

;

1.vector:容器內有三個迭代器分別指向儲存空間的start,finish,end_of_storage

當finish增長到》= end_of_strorage 出發儲存空間2倍增長,原空間中資料複製到新空間。

template

class

vector

iterator end()

iterator size() const

size_type capacity() coanst

bool empty() const

reference operator (size_type n)

reference front()

reference back()

void push_back(const t& x) else

inset_aux(end(),x);

}...

};template

void

vector

::insert_aux(iterator position, const t& x )

else

catch(...)

destroy(begin(), end())

deallocate();

start = new_start;

finish = new_finish;

end_of_storage = new_start + len;

};

array:

有固定的空間不可增長

template

struct

array

iterator end()

}

deque:

由乙個簡單的map構成, 乙個可雙向擴充陣列,陣列中美乙個元素儲存乙個buffer位址。每乙個buffer指向乙個連續儲存空間。

templatet, class alloc = alloc, size_t bufsize = 0>

class deque

iterator end()

size_type size() const

...};inline size_t __deque_buf_size(size_t n ,size_t sz)

templatet class ref,class ptr, size_t bufsize>

struct __deque_iterator ;

stack,和queue 都是由deque adaptor.著倆容器不提供iterator不允許遍歷。stack可選vector, list,deque 作為底層元素。

queue不能選vector作為底層結構。

stack和queue 都不可選擇set/map作為底層結構。

c 類模板 STL(1)

定義類模板 template iterator it 訪問乙個迭代器所指向的元素 迭代器變數名 如 it 5 3 演算法 即很多函式模板的集合,提供了大量演算法,用於操作各種容器。包括了比較 排序 修改 複製等等 演算法通過迭代器操作容器中的元素 vector實際上是對動態陣列的封裝,與陣列一樣,v...

演算法中的STL(1)

2022.03.14 為了準備藍橋杯最近學習了演算法中的部分知識,今天學習了c 中的stl模板庫。今天學習的內容有vector容器,其中常用的函式有 push back 在容器的末尾新增乙個資料 pop back 彈出容器中乙個資料 size 返回容器的大小 clear 清空容器 insert 在指...

STL 1 之雙向佇列 dequeue

deque雙向佇列是一種雙向開口的連續線性空間,可以高效的在頭尾兩端插入和刪除元素,deque在介面上和vector非常相似,下面列出deque的常用成員函式 deque的實現比較複雜,內部會維護乙個map 注意!不是stl中的map容器 即一小塊連續的空間,該空間中每個元素都是指標,指向另一段 較...