您的位置:首页 > 其它

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

2015-04-03 18:12 393 查看
//---------------------------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(0){}
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: