stl源码剖析 详细学习笔记 配接器

//---------------------------15/04/03----------------------------

/*

配接器概述:

1:adapter是一种设计模式:将一个class的接口转换为另一个class的接口,使得原本因接口不兼容而

不能合作的classes可以一起工作。

2:改变仿函数接口的,称为function adapter,改变容器接口的,称为container adapter,

改变迭代器接口的,称为iterator adapter。

3:container adatper:    queue
, stack

4:iterator adapter :    insert iterators, reverse iterators,iostream iterators。

1>insert iterators:把赋值操作转变成插入操作,有三个相应函数:

back_inserter(Container& x),front_inserter(Container& x),inserter(Container& x);

2>Reverse iterators:把迭代器转变成反向迭代器的adapter;

3>iostream iterators:将迭代器绑定到iostream对象身上,实现相应的输入输出功能。

5:functor adapter :包括bind,negate,compose,ptr fun,mem
fun

辅助函数                       
实际效果               
实际产生的对象

bind1st(const Op& op,           op(x, param);       binder1st<Op>

const T& x);                                (op, arg1_type(x))

bind2nd(const Op& op,           op(param, x);       binder2nd<Op>

const T& x);                               (op, arg2_type(x))

not1(const Pred& pred);         !pred(param);       unary_negate<Pred>(pred)

not2(const Pred& pred);         !pred(param1,       binary_negate<Pred>(pred)

param2);

compose1(const Op1& op1,        op1(op2(param));    unary_compose<Op1,Op2>

const Op2& op2);                            (op1, op2)

compose1(const Op1& op1,        op1(op2(param),     unary_compose<Op1,Op2>

const Op2& op2,             op3(param))     (op1, op2, op3)

const Op3& op3);

ptr_fun(Result(*fp)(Arg));      fp(param);          pointer_to_unary_function

<Arg, Result>(fp)

ptr_fun(Result(*fp)             fp(param1,param2);  pointer_to_binary_function

(Arg1,Arg2)                                 <Arg1, Arg2, Result>(fp)

mem_fun(S (T::*f)());           (param->*f)();      mem_fun_t<S, T>(f)

mem_fun(S (T::*f)() const);     (param->*f)();      const_mem_fun_t<S, T>(f)

mem_fun_ref(S (T::*f)());       (param.*f)();       mem_fun_ref_t<S, T>(f)

mem_fun_ref(S (T::*f)()         (param.*f)();       const_mem_fun_ref_t<S, T>(f)

const);

mem_fun1(S (T::*f)(A));         (param->*f)(x);     mem_fun1_t<S, T, A>(f)

mem_fun1(S (T::*f)(A) const);   (param->*f)(x);     const_mem_fun1_t<S, T, A>(f)

mem_fun1_ref(S (T::*f)(A));     (param.*f)(x);      mem_fun1_ref_t<S, T, A>(f)

mem_fun1_ref(S (T::*f)(A)       (param.*f)(x);      const_mem_fun1_ref_t<S, T, A>(f)

const);

*/

//back_insert_iterator

template<class Container>

class back_insert_iterator

{

protected:

Container* container;

public:

typedef output_iterator_tag iterator_category;

typedef void                value_type;

typedef void                difference_type;

typedef void                pointer;

typedef void                reference;

explicit back_insert_iterator(Container& x) : container(&x) {}

//唯一要注意的点,把赋值操作改成了push_back操作

back_insert_iterator<Container>&

operator=(const
typename Container::value_type& value)

{

container->push_back(value);

return *this;

}

//禁止* ++的操作

back_insert_iterator<Container>&
operator*() {return *this;}

back_insert_iterator<Container>&
operator++() {return *this;}

back_insert_iterator<Container>&
operator++(int) {return *this;}

};

//辅助函数,用来返回一个back_insert_iterator对象,使用辅助函数可以使的使用变简单。

template<class Container>

inline back_insert_iterator<Container> back_insert(Container& x)

{

return back_insert_iterator<Container>(x);

}

//front_insert_iterator

template<class Container>

class front_insert_iterator

{

protected:

Container* container;

public:

typedef output_iterator_tag iterator_category;

typedef void                value_type;

typedef void                difference_type;

typedef void                pointer;

typedef void                reference;

explicit front_insert_iterator(Container& x) : container(&x) {}

//注意,迭代器指向的容器要有push_front操作才行

front_insert_iterator<Container>&

operator=(const
typename Container::value_type& value)

{

container->push_front(value);

return *this;

}

//禁止* ++的操作

back_insert_iterator<Container>&
operator*() {return *this;}

back_insert_iterator<Container>&
operator++() {return *this;}

back_insert_iterator<Container>&
operator++(int) {return *this;}

};

//辅助函数,用来返回一个front_insert_iterator对象,

template<class Container>

inline front_insert_iterator<Container> front_insert(Container& x)

{

return front_insert_iterator<Container>(x);

}

//insert_iterator

template<class Container>

class front_insert_iterator

{

protected:

Container* container;

typename Container::iterator iter;

public:

typedef output_iterator_tag iterator_category;

typedef void                value_type;

typedef void                difference_type;

typedef void                pointer;

typedef void                reference;

explicit insert_iterator(Container& x,
typename Container::iterator i)

: container(&x), iter(i) {}

insert_iterator<Container>&

operator=(const
typename Container::value_type& value)

{

iter = container->insert(iter, value);

++iter;

return *this;

}

//禁止* ++的操作

insert_iterator<Container>&
operator*() {return *this;}

insert_iterator<Container>&
operator++() {return *this;}

insert_iterator<Container>&
operator++(int) {return *this;}

};

//辅助函数,用来返回一个insert_iterator对象,

template<class Container>

inline insert_iterator<Container> front_insert(Container& x, iterator i)

{

typedef typename Container::iterator iter;

return insert_iterator<Container>(x, iter(i));

}

//reverse_iterator

template<class Iterator>

class reverse_iterator

{

protected:

Iterator current;

public:

typedef typename iterator_traits<Iterator>::iterator_category

iterator_category;

typedef typename iterator_traits<Iterator>::value_type

value_type;

typedef typename iterator_traits<Iterator>::difference_type

difference_type;

typedef typename iterator_traits<Iterator>::pointer

pointer;

typedef typename iterator_traits<Iterator>::reference

reference;

typedef Iterator iterator_type;

typedef reverse_iterator<Iterator> self;

public:

reverse_iterator(){}

explicit reverse_iterator(iterator_type x): current(x) {}

reverse_iterator(const self& x): current(x.current) {}

iterator_type base()
const { return current; }

reference
operator*() const

{

Iterator tmp = current;

return *--tmp;

}

pointer
operator->() const {
return &(operator*());}

self&
operator++()

{

--current;

return *this;

}

self
operator++(int)

{

self tmp = *this;

--current;

return tmp;

}

self&
operator--()

{

++current;

return *self;

}

self
operator--(int)

{

Iterator tmp = current;

++current;

return tmp;

}

self
operator+(difference_type n)
const

{

return self(current - n);

}

self&
operator+=(difference_type n)

{

current -= n;

return *this;

}

self
operator-(difference_type n)
const

{

return self(current + n);

}

self&
operator-=(difference_type n)

{

current +=n;

return *this;

}

//第二个this

指向 自己的指针,第二个星号不会调用operator*,

//*this是一个reverse_iterator对象,+

第一个* 都会调用operator操作

reference
operator[](difference_type n)
const

{

return *(*this + n);

}

};

//stream iterators

//istream_iterator

template<class T,
class Distance = ptrdiff_t>

class istream_iterator

{

firend
bool

operator== __STL_NULL_TMPL_ARGS(const istream_iterator<T, Distance>& x,

const istream_iterator<T, Distance>& y);

protected:

istream* stream;

T value;

bool end_marker;//输入结束标识

void read()

{

//看stream能否读取到数据,能就设置true,否则设置false

end_marker = (*stream) ?
true : false;

if(end_marker)

*stream >> value;

end_marker = (*stream) ?
true : false;

}

public:

typedef input_iterator_tag  iterator_category;

typedef T                   value_type;

typedef Distance            difference_type;

typedef const T*            pointer;

typedef const T&            reference;

//默认是cin,不会读数据

istream_iterator(): stream(&cin), end_marker(false){}

//如果自己传入一个istream
会马上调用read(),然后就会读数据了

istream_iterator(istream& s): stream(&s) {read();}

reference
operator*() const {
return value;}

pointer
operator->() const {
return &(operator*());}

istream_iterator<T, Distance>&
operator++()

{

read();

return *this;

}

istream_iterator<T, Distance>
operator++(int)

{

istream_iterator<T, Distance> tmp = *this;

read();

return tmp;

}

};

//ostream_iterator

template<class T>

class ostream_iterator

{

protected:

ostream* stream;

const char* string;

public:

typedef output_iterator_tag iterator_category;

typedef void                value_type;

typedef void                difference_type;

typedef void                pointer;

typedef void                reference;

ostream_iterator(ostream& s):stream(&s), string(){}

ostream_iterator(ostream& s,
const char* c):stream(&s), string(c) {};

//改写赋值操作为输出到ostream

ostream_iterator<T>&
operator=(const T& value)

{

*stream << value;

if(string)

*stream << string;

return *this;

}

ostream_iterator<T>&
operator*() {return *this;}

ostream_iterator<T>&
operator++() {return *this;}

ostream_iterator<T>&
operator++(int) {return *this;}

};

//function adapters

//unary_negate

template<class Predicate>

class unary_negate :
public unary_function<typename Predicate::

argument_type,
bool>

{

protected:

Predicate pred;

public:

explicit unary_negate(const Predicate& x):pred(x) {}

bool operator()(const
typename Predicate::argument_type& x)
const

{

return !pred(x);

}

};

template<class Predicate>

inline unary_negate<Predicate> not1(const Predicate& pred)

{

return unary_negate<Predicate>(pred);

}

//binary_negate

template<class Predicate>

class binary_negate :
public binary_function

<typename Predicate::first_argument_type,

typename Predicate::second_argument_type,bool>

{

protected:

Predicate pred;

public:

explicit binary_negate(const Predicate& x): pred(x) {}

bool operator()(const
typename Predicate::first_argument_type& x,

const typename Predicate::second_argument_type& y)
const

{

return !pred(x, y);

}

};

template<class Predicate>

inline binary_negate<Predicate> not2(const Predicate& pred)

{

return binary_negate<Predicate>(pred);

}

//binder1st

template<class Operation>

class binder1st:
public unary_function<typename Operation::second_argument_type,

typename Operation::result_type>

//绑定后就变成unary_function了

{

protected:

Operation op;

typename Operation::first_argument_type value;

public:

binder1st(const Operation& x,

const typename Operation::first_argument_type& y)

:op(x), value(y){}

typename Operation::result_type

operator()(const
typename Operation::second_argument_type& x)
const

{

return op(value,x);

}

};

template<class Operation,
class T>

inline binder1st<Operation> bind1st(const Operation& op,
const T& x)

{

typedef typename Operation::first_argument_type arg1_type;

return binder1st<Operation>(op, arg1_type(x));

}

//binder2nd

template<class Operation>

class binder2nd :
public unary_function<typename Operation::first_argument_type,

typename Operation::result_type>

{

protected:

Operation op;

typename Operation::second_argument_type value;

public:

binder2nd(const Operation& x,

const typename Operation::second_argument_type& y)

:op(x), value(y) {}

typename Operation::result_type

operator(const
typename Operation::first_argument_type& x)
const

{

return op(x, value);

}

};

template<class Operation,
class T>

inline binder2nd<Operation> bind2nd(const Operation& op,

const T& x)

{

typedef typename Operation::second_argument_type arg2_type;

return binder2nd<Operation>(op, arg2_type(x));

}

//unary_compose

template<class Operation1,
class Operation2>

class unary_compose :
public unary_function<typename Operation2::argument_type,

typename Operation1::result_type>

{

protected:

Operation1 op1;

Operation2 op2;

public:

unary_compose(const Operation1& x,
const Operation2& y): op1(x), op2(y) {}

typename Operation2::result_type

operator()(const
typename Operation2::argument_type& x)

{

return op1(op2(x));

}

};

template<class Operation1,
class Operation2>

inline unary_compose<Operation1, Operation2>

compose1(const Operation1& op1,
const Operation2& op2)

{

return unary_compose<Operation1, Operation2>(op1, op2);

}

//binary_compose

template<class Operation1,
class Operation2,
class Operation3>

class binary_compose :
public unary_function<typename Operation2::argument_type,

typename Operation1::result_type>

{

protected:

Operation1 op1;

Operation2 op2;

Operation3 op3;

public:

binary_compose(const Operation1& x,
const Operation2& y,
const Operation3& z)

:op1(x), op2(y), op3(z) {}

typename Operation1::result_type

operator()(const
typename Operation2::argument_type& x)
const

{

return op1(op2(x), op3(x));

}

};

template<class Operation1,
class Operation2,
class Operation3>

inline binary_compose<Operation1, Operation2, Operation3>

compose2(const Operation1& op1,
const Operation2& op2,
const Operation3& op3)

{

return binary_compose<Operation1, Operation2, Operation3>(op1, op2, op3);

}

//ptr_fun

//pointer_to_unary_function

template<class Arg,
class Result>

class pointer_to_unary_function :
public unary_function<Arg, Result>

{

protected:

Result (*ptr)(Arg);

public:

pointer_to_unary_function(){}

explicit pointer_to_unary_function(Result (*x)(Arg)) : ptr(x) {}

Result
operator()(Arg x)
const {return ptr(x); }

};

template<class Arg,
class Result>

inline pointer_to_unary_function<Arg, Result>

ptr_fun(Result (*x)(Arg))

{

return pointer_to_unary_function<Arg, Result>(x);

}

//pointer_to_binary_function

template<class Arg1,
class Arg2, class Result>

class pointer_to_binary_function :
public binary_function<Arg1, Arg2, Result>

{

protected:

Result (*ptr)(Arg1, Arg2)

public:

pointer_to_binary_function(){}

explicit pointer_to_binary_function(Result (*x)(Arg1, Arg2))

:   ptr(x) {}

Result
operator()(Arg1, Arg2)
const {return ptr(x, y); }

};

template<class Arg1,
class Arg2, class Result>

inline pointer_to_unary_function<Arg1, Arg2, Result>

ptr_fun(Result (*x)(Arg1, Arg2))

{

return pointer_to_binary_function<Arg1, Arg2, Result>(x);

}

//mem_fun

//mem_fun_t

template<class S,
class T>

class mem_fun_t :
public unary_function<T*, S>

{

public:

explicit mem_fun_t(S (T::*pf)) : f(pf) {}

S
operator()(T* p) const {
return (p->*f)(); }

private:

S (T::*f)();

};

//cosnt_mem_fun_t

template<class S,
class T>

class cosnt_mem_fun_t :
public unary_function<const T*, S>

{

public:

explicit cosnt_mem_fun_t(S (T::*pf)
const) : f(pf) {}

S
operator()(const T* p)
const { return (p->*f)(); }

private:

S (T::*f)()
const;

};

//mem_fun_ref_t

template<class S,
class T>

class mem_fun1_ref_t :
public unary_function<T, S>

{

public:

explicit mem_fun1_ref_t(S (T::*pf)()) : f(pf) {}

S
operator()(T& r) {
return (r.*f)();}

private:

S (T::*f)();

};

//const_mem_fun_ref_t

template<class S,
class T>

class const_mem_fun_ref_t :
public unary_function<T, S>

{

public:

const_mem_fun_ref_t(S (T::*pf)()
const) : f(pf) {}

S
operator()(const T& r)
const { return (r.*f)();}

private:

S (T::*f)()
const;

};

//mem_fun1_t

template<class S,
class T, class A>

class mem_fun1_t : binary_function<T*, A, S>

{

public:

mem_fun1_t(S (T::*pf)(A)) : f(pf) {}

S
operator()(T* p, A x) {
return (p->*f)(x); }

private:

S (T::*f)(A);

};

//const_mem_fun1_t

template<class S,
class T, class A>

class const_mem_fun1_t :
public binary_function<const T*, A, S>

{

public:

const_mem_fun1_t(S (T::*pf)
const ) : f(pf) {}

S
operator()(const T* p, A x)
const { return (p->*f)(x); }

private:

S (T::*f)(A)
const;

};

//mem_fun1_ref_t

template<class S,
class T, class A>

class mem_fun1_ref_t : binary_function<T, A, S>

{

public:

mem_fun1_ref_t(S (T::*pf)(A)) : f(pf) {}

S
operator()(T& r, A x) {
return (r.*f)(x); }

private:

S (T::*f)(A);

};

//const_mem_fun1_ref_t

template<class S,
class T, class A>

class const_mem_fun1_ref_t :
public binary_function<T, A, S>

{

public:

const_mem_fun1_ref_t(S (T::*pf)
const ) : f(pf) {}

S
operator()(const T& r, A x)
const { return (r.*f)(x); }

private:

S (T::*f)(A)
const;

};

//各个辅助函数

//fun

template<class S,
class T>

inline mem_fun_t<S,T> mem_fun(S (T::*f)())

{

return mem_fun_t<S,T>(f);

}

template<class S,
class T>

inline const_mem_fun_t<S,T> mem_fun(S (T::*f)()
const)

{

return const_mem_fun_t<S,T>(f);

}

template<class S,
class T>

inline mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)())

{

return mem_fun_ref_t<S,T>(f);

}

template<class S,
class T>

inline const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)()
const)

{

return const_mem_fun_ref_t<S,T>(f);

}

//fun1

template<class S,
class T, class A>

inline mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A))

{

return mem_fun1_t<S,T,A>(f);

}

template<class S,
class T, class A>

inline const_mem_fun1_t<S,T,A> mem_fun(S (T::*f)(A)
const)

{

return const_mem_fun1_t<S,T,A>(f);

}

template<class S,
class T, class A>

inline mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A))

{

return mem_fun1_ref_t<S,T,A>(f);

}

template<class S,
class T, class A>

inline const_mem_fun1_ref_t<S,T,A> mem_fun_ref(S (T::*f)(A)
const)

{

return const_mem_fun1_ref_t<S,T,A>(f);

}

上一篇:编程思想—依赖注入(DI)并非实现控制反转(IOC)的最佳方法


下一篇:Some practices to write better C#/.NET code(译)