《STL原始碼剖析》chapter8 配接器

2021-10-20 09:36:52 字數 4251 閱讀 9162

配接器概述

stl提供的配接器可以分為三類:

iterator adapter:改變迭代器的介面

container adapter:改變容器介面

function adapter:改變仿函式的介面

iterator adapter

在stl中iterator adapter又可以分為三類:

insert iterators:包括back_inserter,front_inserterinserter三種

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包括stackqueue,在之前的容器部分討論過,這裡不再贅述。

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 由第...