配接器概述
stl提供的配接器可以分為三類:
iterator adapter
:改變迭代器的介面
container adapter
:改變容器介面
function adapter
:改變仿函式的介面
iterator adapter
在stl中iterator adapter
又可以分為三類:
insert iterators
:包括back_inserter
,front_inserter
和inserter
三種
reverse iterator
:將迭代器的移動行為倒轉
stream iterators
:將迭代器繫結到乙個strem
(資料流)物件身上
insert iterators
實際上是對容器的一種封裝,其中back_inserter
實際是呼叫底層容器的push_back()
介面,front_inserter
實際是呼叫底層容器的push_front()
介面,而inserter
實際是呼叫底層容器的insert()
介面。
inserter iterators
的部分實現如下:
//back_inserter在stl中呼叫模板類back_insert_iterator實現
template
<
class
container
>
class
back_insert_iterator
//關鍵所在
back_insert_iterator
&operator=(
const
typename container::value_type& value)
//...};
//...
reverse iterator
將迭代器的移動行為倒裝,其底層將正向迭代器的++
當做--
,--
當做++
,所以使用reverse iterator
必須至少是bidirectional iterator
.
其部分重要實現如下:
//reverse_iterator
//是前進為後退,後退為前進
template
<
class
iterator
>
class
reverse_iterator
//關鍵所在
reference operator*(
)const
//前進變後退
self&
operator++(
)//後退變前進
self&
operator--(
)//...
};
stream iterators
的實現是通過底層繫結乙個stream object
.(思想值得借鑑)
對於istream_iterator
是通過繫結乙個istream objects
,客戶端對這個迭代器所做的operator++
操作,會被導引呼叫迭代器內部所含的那個istream member
的輸入操作(operator>>
),這個迭代器是input iterator
,不具備operator--
;
其部分實現如下:
//istream_iterator
template
<
classt,
class
distance
=ptrdiff_t>
class
istream_iterator
public
://...
istream_iterator()
:stream
(&cin)
,end_marker
(false
)//這裡設計的有缺陷:
// istream_iteratoreos; //造成end_marker為false
// istream_iteratoriniter(cin); //引發read()
// cout<<"please input..."(istream& s)
:stream
(&s)
typedef conat t& reference;
reference operator
*const
//迭代器前進乙個位置,就代表讀取一筆資料
istream_iterator
&operator++(
)//...
};
ostream_iterator
在底層繫結乙個ostream object
,客戶端對這個迭代器所做operator=
操作,會呼叫ostream memeber
的輸出操作(operator<<
),這個迭代器是個outputiterator
其部分實現如下:
//ostream_iterator
template
<
class
t>
class
ostream_itreator
ostream_iterator
(ostream& s,
const
char
& c)
:stream
(&s)
,string
(c) ostream_iterator
&operator=(
const t& value)
ostream_iterator
&operator*(
) ostream_iterator
&operator++(
) ostream_iterator
&operator++(
int)
//...
};
container adapters
container adapters
包括stack
和queue
,在之前的容器部分討論過,這裡不再贅述。
function adapters
function adapters
內部也藏了乙個member object
,其型別等同於它所要配接的物件(那個物件當然是乙個「可配接的仿函式」,adaptable functor).當function adatper
有了完全屬於自己的乙份修飾物件在手,它就成了該修飾物件的主人,也就有資格呼叫該修飾物件,並在引數和返回值上面動手腳。
下面以binder1st
為例(在c++11中是bind
)
//binder1st
template
<
class
operation
>
class
binder1st
:public unary_function<
typename operation::second_argument_type,
typename
operator
::result_type>
//這是關鍵
typename operation::result_type
operator()
(const
typename operation::second_argument_type& x)
const
};
STL原始碼剖析
這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...
STL原始碼剖析
這兩天略讀完了 stl原始碼剖析 之所以是略讀,就是只看大體,不講具現 這個詞在 深度探析c 物件模型 中比較多 已經看過好幾本c 的書了,感覺c 本身設計的博大精深,而c 編譯器就更是乙個神奇的東西,換句話說,你永遠不知道c 編譯器揹著你做了哪些出乎你意料的事 不扯遠了 我主要是想看stl容器的具...
STL原始碼剖析
花了兩天時間略讀了一下 stl原始碼分析 看了個大體,對於細節並沒有深究。之所以想翻翻這本書,主要是想看看stl中的特性 介面卡的具體實現。看完之後收穫還是蠻大的,模板的各種組合讓我眼前一亮,下面大概總結一些內容。1.記憶體分配 sgi記憶體分配採用兩級實現,對於大記憶體塊的申請 大於128k 由第...