• 【STL源码剖析读书笔记】【第8章】配接器


    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 6
    	cout << endl;
    	
    	copy(begin(ia), begin(ia) + 3, front_inserter(deq));
    	copy(deq.begin(), deq.end(), outiterator);//3 2 1 1 2 3 4 5 6
    	cout << 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 3
    	cout << 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 3
    	cout << endl;
    
    	deque<int>::reverse_iterator reiterator(deq.end());
    	cout << *reiterator << " "; //3
    	cout << *(++++++reiterator)<<" "; //6
    	cout << *(--reiterator) << " "; // 1
    	cout << *reiterator.base() << " " << endl;//2
    
    	istream_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 3
    	cout << 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; //4
    
    	for_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;
    }
    

  • 相关阅读:
    thinkphp 关联
    php io
    phpstorm 生产php pojo类
    解决在mysql表中删除自增id数据后,再添加数据时,id不会自增1的问题
    thinkphp model
    thinkphp 数据库连接报错 SQLSTATE[HY000] [2002] No such file or directory
    thinkphp获取目录的方法
    thinkphp数据库连接
    css3背景颜色渐变属性
    CentOS开机自动运行自己的脚本详解
  • 原文地址:https://www.cnblogs.com/ruan875417/p/4558294.html
Copyright © 2020-2023  润新知