二.traits(萃取机)

简介: 一.traits(萃取机)==traits分为俩种:==#### 1.iterator_traits负责萃取迭代器的性质(迭代器的特性->相应性别)。* 迭代器相应的型别分为五种:value type,difference type,pointer,reference,iterator_catagaly。1. ==value type==--------------迭代器所指对象的型别。2. ==difference type==-------表示俩个迭代器之间的距离,因此可以表示容器的最大容量。对于连续的空间来说,头尾之间的距离就是其中的 最大容量,例如STL

一.traits(萃取机)

==traits分为俩种:==

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

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

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

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

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

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

5.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 )

​ 继承关系

1661148661847.png

  • 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 Category     iterator_category;
     typedef T            value type;
     typedef Distance     difference_type;
     typedef Pointer      pointer;
     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,再利用 type traits 判断该型别是否为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;
}
目录
相关文章
|
9月前
|
存储 测试技术 编译器
芯片测试:万字长文一起聊聊IC测试机-ATE
芯片测试:万字长文一起聊聊IC测试机-ATE
1112 0
omni_usdt钱包文件keypoolsize是否持续为100个地址测试
omni_usdt钱包文件keypoolsize是否持续为100个地址测试
|
9月前
|
编解码 开发工具 vr&ar
DP活动:以太网HMI线下培训RA6M3 HMI Board[MQTT Squareline LVGL]
DP活动:以太网HMI线下培训RA6M3 HMI Board[MQTT Squareline LVGL]
124 1
|
芯片
一款专为POS机设计的芯片解决方案
一、基本概述 HCM8003设计用于磁条读卡器系统。它会从F/2F恢复时钟和数据信号磁产生的数据流头HCM8003将用于数据速率从200到15000比特每秒。 二、典型电路 内部数据的采集和跟踪这个范围是自动的。可以应用于POS机终端设备、磁卡门禁系统、身份识别等场合。 三、引脚定义 四、内部功能框图 HCM8003由每个通道的三个主要模块组成: 放大模块 该块放大并过滤从读磁头读取的信号,拒绝共模噪声并检测信号峰值。它还包括保护电路组件。并锁存到数据速率上,并从F/2F执行单个位的恢复数据流。 A/D转换器模块 输入模拟信号经放大器放大后,将转换为数字F/2F信号通过A/
119 1
|
数据采集 人工智能 芯片
课外闲谈3.define与typedef的区别
第一行中的宏定义的意思就是将INT_PTR这样的一个符号代替int*,所以在这里,b只是一个普通变量。
131 0
课外闲谈3.define与typedef的区别
【C++的万能超级无敌头文件 #include <bits/stdc++.h> 】
【C++的万能超级无敌头文件 #include <bits/stdc++.h> 】
|
C++ 容器
【C++】C++11新特性:变参模板、完美转发和emplace
【C++】C++11新特性:变参模板、完美转发和emplace
【C++】C++11新特性:变参模板、完美转发和emplace
C语言:sizeof和strlen的区别
1.指针在32位平台和64位平台的大小是不同的,32位下是4字节,64位下是8字节