1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 二.traits(萃取机)

二.traits(萃取机)

时间:2018-09-10 15:19:23

相关推荐

二.traits(萃取机)

文章目录

一.traits(萃取机)1.iterator_traits负责萃取迭代器的性质(迭代器的特性->相应性别)。2.__type_traits负责萃取型别的特性。举个例子:uninitalized_fill_n

一.traits(萃取机)

traits分为俩种:

1.iterator_traits负责萃取迭代器的性质(迭代器的特性->相应性别)。

迭代器相应的型别分为五种:value type,difference type,pointer,reference,iterator_catagaly。

value type--------------迭代器所指对象的型别。

difference type-------表示俩个迭代器之间的距离,因此可以表示容器的最大容量。对于连续的空间来说,头尾之间的距离就是其中的 最大容量,例如STL当中的count(),其传回值就必须使用这种迭代器。

reference type--------从迭代器所指之物的内容是否允许改变,所指对象内容不允许改变为 constant iterator. 例如const int * p(常量指针),允许所指对象内容改变的为mutable iterator.例如 int *p(普通指针)。

pointer type------------迭代器所指内容或者地址都可以。

iterator_catagaly-----根据移动特性将迭代器分为五种。

Input Iterator-------------只读,不能改变 (operator++)

Output Iterator-----------只写 (operator++)

Forward Iterator---------读写 (operator++)

Bidirectional Iterator----双向移动 (operator++,operator–)

Random Access Iterator-随机 (operator++,–,+n,-n,p1-p2,p1<p2 )

​ 继承关系

std::iterator的保证。为了符合规范,任何迭代器都应该提供五个内嵌相应型别,否则无法与其他STL组件顺利搭配。因此STL提供了一个iterator class如下,如果每个新设计 的迭代器都继承它,那么就可以保证符合STL所需规范:

template<class Category,class T,class Distance = ptrdifff_t,class Pointer = *T,class Reference = T&>struct iterator{typedef Categoryiterator_category;typedef T value type;typedef Distancedifference_type;typedef Pointerpointer;typedef Reference referencec;}

iterator_traits总结: 它的作用就是在无法确定类型性别的时候,通过它可以来获得参数的类型型别,例如:在函数重载过程中,为了更加高效快速的确定使用哪个版本的重载,这时可以用traits来萃取出它的类型型别,来确定使用哪一个重载函数。

2.__type_traits负责萃取型别的特性。

型别的特性有:trivial ctor, copy ctor,assignment,dtor以及non-trivial ctor, copy ctor,assignment,dtor,如果答案是不重要的,那我们在对型别进行构造,析构,拷贝,赋值等操作时就可以采用最有效的措施(例如不需要调用constructor,destructor),而是采用内存直接处理操作如 malloc(),nencpy()等。
举个例子:uninitalized_fill_n

template <class ForwardIterator, class Size, class T>inline ForwardIterator uninitialized_ fill_ n (ForwardIterator first,Size n, const T& х) {return uninitialized_ fill_ n(first,n, x, value_ type(first)) ;}

该函数以x为蓝本,自迭代器first 开始构造n个元素。为求取最大效率, 首先以value_ type() (3.6 节)萃取出迭代器first 的value type,再利用typetraits 判断该型别是否为POD型别:

template <class ForwardIterator, class Size, class T, class T1> inline ForwardIterator uninitializeđ fill n (ForwardIterator first,Size n, const T&x, T1*){typedef typename _ type_ traits<Tl>::is_ POD_ _type is_ POD;return _uninitialized_ fill_ n_ aux(first, n, x, is_ _POD()) ;}

如果不是POD型别,就会执行下面措施

template <class ForwardIterator, class Size, class T>ForwardIterator__uninitialized_ fill_ n (ForwardIterator first,Size n, const T& х,__false_type){ForwardIterator cur = first;for (; n> 0;--n, ++cur)construct(&*cur, x);return cur;}

如果是POD型别,就会执行下面措施

template<class ForwardIterator, class Size, class T>inline ForwardIterator__uninitialized_fi11 n_ aux (ForwardIterator first, Size n,const T& X,一true_ type) {return fill_ n(first, n, x); //交由高阶函数执行, 如下所示}

以下是定义fill_n()

OutputIterator £111 n(OutputIterator first, Size n, const T& value) {for( ; n> 0; --n, ++first)*first = value; return first;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。