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容器 即一小塊連續的空間,該空間中每個元素都是指標,指向另一段 較...