【STL源码剖析读书笔记】【第8章】配接器
来源:互联网 发布:windows 桌面路径 编辑:程序博客网 时间:2024/06/06 00:58
1、 设计模式中对配接器的定义如下:将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes可以一起运作。
2、 容器配接器
stack和queue是两个容器配接器,底层默认由deque构成。stack封住了所有的deque对外接口,只开放符合stack原则的几个函数;queue封住了所有的deque对外接口,只开放符合queue原则的几个函数。
3、 迭代器配接器
3.1 insert iterators
insert iterators包括back_insert_iterator,front_insert_iterator和insert_iterator。主要观念是,每个insertiterators内部都维护有一个容器;容器有自己的迭代器,当客户端对insert iterators做赋值操作时,就在insert iterators中转为对该容器的迭代器做插入操作,其他的迭代器功能则被关闭。
3.2 reverse iterators
reverse iterators将迭代器的移动行为倒转。 当迭代器被逆转,虽然实体位置不变,但逻辑位置必须改变,主要是为了配合迭代器区间的“前闭后开“习惯。
3.3 stream iterators
stream iterators可以将迭代器绑定到某个stream对象身上。绑定一个istreamobject,其实就是在istream iterator内部维护一个istream member,客户端对这个迭代器做的operator++操作,会被导引调用内部所含的那个istream member的输入操作。绑定一个ostream object,就是在ostream iterator内部维护一个ostream member,客户端对这个迭代器做的operator=操作,会被导引调用内部所含的那个ostream member的输出操作。
3.4 具体例子
#include<algorithm>#include<deque>#include<iterator>#include<iostream>using namespace std;int main(){int ia[] = { 1, 2, 3, 4, 5, 6 };deque<int> deq(begin(ia), end(ia));ostream_iterator<int> outiterator(cout, " ");copy(deq.begin(), deq.end(), outiterator); //1 2 3 4 5 6cout << endl;copy(begin(ia), begin(ia) + 3, front_inserter(deq));copy(deq.begin(), deq.end(), outiterator);//3 2 1 1 2 3 4 5 6cout << endl;copy(begin(ia), begin(ia) + 3, back_inserter(deq));copy(deq.begin(), deq.end(), outiterator);//3 2 1 1 2 3 4 5 6 1 2 3cout << endl;deque<int>::iterator it = find(deq.begin(), deq.end(), 4);copy(begin(ia), begin(ia) + 3, inserter(deq,it));copy(deq.begin(), deq.end(), outiterator);//3 2 1 1 2 3 1 2 3 4 5 6 1 2 3cout << endl;deque<int>::reverse_iterator reiterator(deq.end());cout << *reiterator << " "; //3cout << *(++++++reiterator)<<" "; //6cout << *(--reiterator) << " "; // 1cout << *reiterator.base() << " " << endl;//2istream_iterator<int> initerator(cin), eos;copy(initerator, eos, inserter(deq, deq.begin()));copy(deq.begin(), deq.end(), outiterator);//3 2 1 1 2 3 1 2 3 4 5 6 1 2 3cout << endl;system("pause");return 0;}
4、 仿函数配接器
仿函数配接操作包括绑定(bind)、否定(negate)、组合(compose)、以及对一般函数或成员函数的修饰。仿函数配接器的价值在于,通过它们之间的绑定、组合、修饰能力,几乎可以创造出各种可能的表达式,配合STL算法。每一个仿函数配接器内藏了一个member object,其型别等同于它所要配接的对象。
具体例子
#include<algorithm>#include<vector>#include<iterator>#include<functional>#include<iostream>using namespace std;void print(int i){cout << i << " ";}class Int{public:explicit Int(int i) :m_i(i){}void print1() const{ cout << "[" << m_i << "]"; }private:int m_i;};int main(){ostream_iterator<int> outiterator(cout, " ");int ia[] = { 2, 21, 12, 7, 19, 23 };vector<int> vec(begin(ia), end(ia));cout << count_if(vec.begin(), vec.end(), not1(bind2nd(less<int>(), 12))) << endl; //4for_each(vec.begin(), vec.end(), print);cout << endl;for_each(vec.begin(), vec.end(), ptr_fun(print));cout << endl;Int t1(1), t2(2), t3(3), t4(4), t5(5);vector<Int> vec2;vec2.push_back(t1);vec2.push_back(t2);vec2.push_back(t3);vec2.push_back(t4);vec2.push_back(t5);for_each(vec2.begin(), vec2.end(), mem_fun_ref(&Int::print1));cout << endl;system("pause");return 0;}
- 【STL源码剖析读书笔记】【第8章】配接器
- 【STL源码剖析读书笔记】【第2章】空间配置器
- 【STL源码剖析读书笔记】【第7章】仿函数
- STL源码剖析 -- 读书笔记
- STL源码剖析读书笔记
- STL源码剖析读书笔记
- [读书笔记]《STL源码剖析》
- 【STL源码剖析读书笔记】【第1章】STL概论与版本简介
- 《STL源码剖析》读书笔记---第2章 空间配置器
- 《STL源码剖析》读书笔记------第3 章 迭代器概念与traits编程技法
- 《STL源码剖析》读书笔记---第4章 序列式容器
- 【STL源码剖析读书笔记】【第3章】迭代器概念与traits编程技法
- 【STL源码剖析读书笔记】【第4章】序列式容器之vector
- 【STL源码剖析读书笔记】【第4章】序列式容器之list和slist
- 【STL源码剖析读书笔记】【第4章】序列式容器之deque
- 【STL源码剖析读书笔记】【第4章】序列式容器之stack和queue
- 【STL源码剖析读书笔记】【第4章】序列式容器之heap和priority_queue
- 【STL源码剖析读书笔记】【第5章】关联式容器之RB-tree
- java中的锁池和等待池
- 【转】android开发中,可能会导致内存泄露的问题
- opencv基础学习20150527
- linux 内核中的 __define_initcall
- android oom 全解析
- 【STL源码剖析读书笔记】【第8章】配接器
- spring的原理
- Web services之Axis
- 编译错误 在msvcrtd.lib(libcmt.lib)中重定义
- 栈和堆
- #20 Valid Parentheses
- Apache MiNa 实现多人聊天室(好文,收藏)
- PyQt4 将QTDesigner的界面 在py中展示
- Ubuntu 安装mysql