C++笔记九(STL与泛型编程)

2017-06-06  本文已影响0人  小小出大炮

本周内容
(1)迭代器的分类(category)
(2)迭代器分类对算法的影响
(3)STL算法
(4)仿函数/函数对象
(5)Adapter
(6)binder2nd and not1
(7)bind
(8)reverse_iterator、inserter、ostream_iterator、istream_iterator

Algorithm看不见Container,对其一无所知;所以,它所需要的一切信息都必须从Iterators取得,而Iterators(Containers供应)必须能够回答Algorithm的所有提问,才能搭配该Algorithm的所有操作。

一 迭代器的分类

//五种iterator category
struct input_iterator_tag{ };
struct output_iterator_tag{ };
struct forward_iterator_tag;public input_iterator_tag{ };
struct bidrectional_iterator_tag;public forward_iterator_tag{ };
struct random_access_iterator_tag;public bidrectional_iterator_tag{ };

五种iterator的关系如下:


iterator_category.png

二 迭代器分类对算法的影响

三 算法

template<typename Iterator>
std::Algorithm(Iterator itr1,Iterator itr2,...)
{
    ...
}
//range-based for statement since C++11
for( dec1:coll ) {
    statement
}
for( int i : {2,3,4,5,3,23,424,5} ){
    cout << i << endl;
}

四 仿函数/函数对象

五 Adapters

六 Binder2nd and not1

七 新型适配器bind(since C++11)

std::bind可以绑定:
(1)functions
(2)function objects
(3)member functions,_1(占位符号)必须是某个object地址。
(4)data members,_1必须是某个object地址。
返回一个function object ret。调用ret相当于调用上述1,2,3,或相当于取出4。

新版本代替了很多旧版本的东西,如下图:


bind.png

八 reverse_iterator、inserter、ostream_iterator、istream_iterator

下面介绍几种典型的适配器,这些适配器类似得对算法(例如copy)作了符号重载,使得同一个函数能够有不同的解读,这非常巧妙。

inserter.png istream_iterator.png

下图是istream_iterator另一个例子,当使用者打出例2的代码,因为其实第一行已经有输入了,若是在下一行写入提示代码(“请输入”),则这一行提示代码不会出现,使得使用者会大吃一惊,需要注意!


istream_iterator.png
上一篇 下一篇

猜你喜欢

热点阅读