2018-02-24

Boolan STL 第五周

语言层面,STL中算法是function template,其他的容器、迭代器、仿函数、适配器、分配器都是class template

由于algorithms看不到container,所以iterator必须能提供给algorithms提出问题的答案。

iterator的5种类型:

2018-02-24_第1张图片

array、vector、deque属于random_access_iterator_tag

list、rb_tree(set/map等)属于bidirectional_iterator_tag

forward_list、hashtable(unordered set/map等)属于forward_iterator_tag

istream_iterator属于input_iterator_tag

ostream_iterator属于output_iterator_tag

iterator_category对算法的影响:可以通过使用萃取机识别出不同的类别的iterator来重载函数的不同实现。如:distance()函数

2018-02-24_第2张图片

iterator_category配合type traits可以使算法针对不同容器的迭代器产生不同的实现,如copy()

2018-02-24_第3张图片

算法源码中对应该使用哪种类型的iterator有暗示:

2018-02-24_第4张图片

通过给算法传入自定义functor实现特定功能:如accumulate()

2018-02-24_第5张图片

算法count/count_if:

2018-02-24_第6张图片

算法find/find_if:

2018-02-24_第7张图片

算法sort使用:

2018-02-24_第8张图片

算法binary_search:必须先排序,才能进行二分搜寻

2018-02-24_第9张图片

仿函数functor:只为算法服务,必须要根据参数数量继承unary_function或binary_function才能算可适配的(adaptable),因为他提供了一些会被算法问到的typedefine

2018-02-24_第10张图片
2018-02-24_第11张图片

适配器:根据要改造的东西分为container adapter、iterator adapter、functor adapter,适配器和被改造的原型是combination的关系。

iterator和functor能提供算法回答所需的typedefine:

2018-02-24_第12张图片

函数适配器:改造functor。如:bind2nd、not1

2018-02-24_第13张图片
2018-02-24_第14张图片

c++11新适配器bind用法:

2018-02-24_第15张图片

迭代器适配器:改造iterator,如reverse_iterator、inserter

2018-02-24_第16张图片
2018-02-24_第17张图片

x适配器:如istream_iterator和ostream_iterator

2018-02-24_第18张图片
2018-02-24_第19张图片

你可能感兴趣的:(2018-02-24)