STL源码-traits的使用

《STL源码剖析》学习之traits编程 在设计模式中有一种模式叫迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通过迭代器,容器和算法可以有机的粘合在一起。在这里提到了一个叫迭代器的东西.... 阅读详情

 关于iterator traits和type traits的使用,我们什么时候会使用这两个类?我们怎么使用?

//问题:将[first1,last1)区间内的元素复制一遍。
//我们需要知道first1迭代器的类型。。
template<class _Iter>
_Iter copy(_Iter first1,_Iter last1)
{
	//首先需要分配足够的空间,即迭代器所指元素的大小乘以个数
	typedef typename iterator_traits<_Iter>::value_type _T;
	_T* __result=new _T[last1-first1];
	//然后我们需要进行复制
	_T* __p=__result;
	for(;first1!=last1;++first1,++__p){
		//这里的复制,我们需要知道_T是否是具有快速的复制构造函数
		typedef typename __type_traits<_T>::has_trivial_copy_constructor   _Copy_traits;
		//如果_Copy_traits是__true_type那么就使用快速的copy,如果是__false_type那么就使用慢的copy,这里怎么判断两者相等
		//是个问题。。。
		//方法一:
		_Copy_traits __ct;__true_type __tt;
		if(typeid(__ct)==typeid(__tt)){__quick_copy(__p,__first);}
		else __normal_copy(__p,__first);
		//方法二:
		//mfc中的策略
		//方法三:利用函数的重载机制和模板推断机制
		__copy(_Iter(__p),__first,_Copy_traits());
	}
	return _Iter(__result);
}
template<class _Iter>
void __copy(_Iter __dest,_Iter __source,__true_type)
{
	__quick_copy(__dest,__source);
}
template<class _Iter>
void __copy(_Iter __dest,_Iter __source,__false_type)
{
	__normal_copy(__dest,__source);
}

这就是traits使用的大体情况,这里stl中使用的统一技术就是函数重载与模板推断机制


举两个stl中的例子:他们遵循的模式都是:定义接口--利用模板推断和重载将任务分配或者说是路由-----特化特定的类型提高速度

//两个例子:
template <class _Tp>
inline void destroy(_Tp* __pointer) {
  __pointer->~_Tp();
}

//补充__VALUE_TYPE
template <class _Iter>
inline typename iterator_traits<_Iter>::value_type*
__value_type(const _Iter&)
{
  return static_cast<typename iterator_traits<_Iter>::value_type*>(0);//返回的是指针,这里的技术需要注意
}
template <class _Iter>
inline typename iterator_traits<_Iter>::value_type*
value_type(const _Iter& __i) { return __value_type(__i); }

#define __VALUE_TYPE(__i)  value_type(__i)

//销毁对象,下面使用的策略是、其实完全不必要,只是为了在stl中使用一致的策略
template <class _ForwardIterator>
inline void _Destroy(_ForwardIterator __first, _ForwardIterator __last) {
  __destroy(__first, __last, __VALUE_TYPE(__first));//根据迭代器萃取类型信息
}
template <class _ForwardIterator, class _Tp>
inline void 
__destroy(_ForwardIterator __first, _ForwardIterator __last, _Tp*)//我们需要类型信息
{
  typedef typename __type_traits<_Tp>::has_trivial_destructor
          _Trivial_destructor;
  __destroy_aux(__first, __last, _Trivial_destructor());
}
template <class _ForwardIterator>
void
__destroy_aux(_ForwardIterator __first, _ForwardIterator __last, __false_type)
{
  for ( ; __first != __last; ++__first)
    destroy(&*__first);//传递给destroy的是指针,此处主要是迭代器与指针的不兼容性
}

template <class _ForwardIterator> 
inline void __destroy_aux(_ForwardIterator, _ForwardIterator, __true_type) {}
//特化
inline void _Destroy(char*, char*) {}
inline void _Destroy(int*, int*) {}
inline void _Destroy(long*, long*) {}
inline void _Destroy(float*, float*) {}
inline void _Destroy(double*, double*) {}

//copy:
template <class _InputIter, class _ForwardIter>
inline _ForwardIter uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result)
{
  return __uninitialized_copy(__first, __last, __result, __VALUE_TYPE(__result));
}

template <class _InputIter, class _ForwardIter, class _Tp>
inline _ForwardIter __uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result, _Tp*)
{
  typedef typename __type_traits<_Tp>::is_POD_type _Is_POD;
  return __uninitialized_copy_aux(__first, __last, __result, _Is_POD());
}

template <class _InputIter, class _ForwardIter>
inline _ForwardIter __uninitialized_copy_aux(_InputIter __first, _InputIter __last,_ForwardIter __result,__true_type)
{
  return copy(__first, __last, __result);
}
template <class _InputIter, class _ForwardIter>
_ForwardIter  __uninitialized_copy_aux(_InputIter __first, _InputIter __last, _ForwardIter __result, __false_type)
{
  _ForwardIter __cur = __result;
  __STL_TRY {
    for ( ; __first != __last; ++__first, ++__cur)
      _Construct(&*__cur, *__first);
    return __cur;
  }
  __STL_UNWIND(_Destroy(__result, __cur));
}

//对于char和wchar_t的特化版本
inline char* uninitialized_copy(const char* __first, const char* __last,
                                char* __result) {
  memmove(__result, __first, __last - __first);
  return __result + (__last - __first);
}

inline wchar_t* 
uninitialized_copy(const wchar_t* __first, const wchar_t* __last,
                   wchar_t* __result)
{
  memmove(__result, __first, sizeof(wchar_t) * (__last - __first));
  return __result + (__last - __first);
}


STL源码分析--萃取编程(traits)技术的实现 1.为什么要出现? 按照默认认定,一个模板给出了一个单一的定义,可以用于用户可以想到的任何模板参数!但是对于写模板的人而言,这种方式并不灵活,特别是遇到模板参数为指针时,若想实现与类型的参量不一样的实例化,就变得不太可能了!也有时,想禁止此种相同的实例化变得不太可能!故而出现了,Partial Specialization! 同时,在使用void*指针时,可以最大限度的共享代码,减少代码的膨胀 阅读详情

相关推荐

STL源码剖析(侯杰)——读书笔记

文章目录STL源码剖析(侯杰)——读书笔记1. STL概论2.空间配置器SGI标准空间配置器, std::allocatorSGI特殊的空间配置器, std::alloc构造和析构 construct()和destroy()空间配置与释放3.迭代器概念与traits编程概念迭代器相应型别传递Traits编程技法——STL源码门钥Partial Specialization(偏特化)的意义std::iterator的保证4.序列式容器vector**list**dequestackqueueheappri

风源- 5240

STL源码剖析中 traits的使用

#include using std::cout; using std::endl; //归根到底就是使用了function template的参数推导机制(argument deduction) //traits函数 生成一个该类型的临时对象,然后返回该对象 //而真正的调用函数根据临时对象的类型决定调用哪个函数,当然这些函数是重载的,只是根据类型不同调用不同的重载函数而已 // // //

Welcome Home , Thierry Henry. 719

C++ STL 源码剖析之 Traits 编程技法

C++ STL 源码剖析之 Traits 编程技法导语template 参数推导声明内嵌型别救世主 Traits函数偏特化加入中间层总结 导语 在 STL 编程中,容器和算法是独立设计的,即数据结构和算法是独立设计的,连接容器和算法的桥梁就是迭代器了,迭代器使其独立设计成为可能。如下图所示: 上图给出了 STL 的目标就是要把数据和算法分开,分别对其进行设计,之后通过一种名为 iterator 的东西,把这二者再粘接到一起。 设计模式中,关于 iterator 的描述为:一种能够顺序访问容器中每个元素的方法

希望我的博客,能帮上你解决学习中工作中所遇到的问题 816

iterator_traits

iterator_traits 文章目录iterator_traits一、iterator_traits是什么二、STL中算法与迭代器的关系三、iterator_traits在算法中充当的角色==**提问:**====**解答:**==四、自定义一个iterator_traits 一、iterator_traits是什么 我们先用一句话来概括iterator_traits:是一个特性类,用来定义迭...

nipirennipi136的博客 1765

深入解析STM32定时器中央对齐模式3的双中断机制

本文深入解析了STM32定时器中央对齐模式3的双中断机制。该模式在一个PWM周期内,会在计数器到达ARR(上溢)和0(下溢)时各触发一次更新中断,实现更精细的实时控制。文章详细阐述了其工作原理、配置方法,并指导如何在中断服务函数中通过DIR位区分中断来源,同时探讨了其在电机控制、数字电源等场景下的应用优势与CPU负载挑战。

weixin_29164185的博客 493

Java电商秒杀系统性能优化(一)——电商秒杀系统框架回顾

电商秒杀系统框架回顾项目简介外部依赖框架回顾项目要点项目中存在的问题小结 课程是免费的,课程地址如下:SpringBoot搭建电商秒杀项目,课程真的很棒,作者的思路很清晰,建议各位读者可以跟着视频练习一下这个项目; 项目简介 通过SpringBoot快速搭建的前后端分离的电商基础秒杀项目。项目通过应用领域驱动型的分层模型设计方式去完成:用户otp注册、登陆、查看、商品列表、进入商品详情以及倒计时秒...

ghw15221836342的博客 3720

《STL源码剖析》-学习笔记03-traits编程在迭代器内部函数实现时的使用

首先需要明确,定义一个迭代器时,为了防止出现注意不到的错误,大多数情况会继承自标准库中的std::iterator,但此iterator纯粹是类型定义,不会产生内存开销。这样,通过实现重载的__distance()函数,便可实现distance函数识别迭代器类型来调用不同__distance()函数的重载版本,提高效率。上一文章写出了traits编程的设计思想,本文会列出它在迭代器内部获取两迭代器之间距离函数distance()的功效和注意点。

m0_74475458的博客 105

SoC验证新思路:除了UVM仿真,你还可以试试Cadence JasperGold的形式化验证

本文深入探讨了Cadence JasperGold形式化验证在SoC设计中的创新应用,对比传统UVM仿真验证,详细解析了其数学穷尽性验证优势。通过实战案例展示了JasperGold在总线协议、时钟域交叉等关键场景的验证方法,并提供了混合验证流程设计与效能优化方案,帮助工程师提升验证效率30%以上。

weixin_30566063的博客 121

温习一下stl的traits技法

//五种迭代器类型 struct input_iterator_tag{}; struct output_iterator_tag{}; struct forward_iterator_tag:public input_iterator_tag{}; struct bidirectional_iterator_tag:public forward_iterator_tag{}; struct ra

不积硅步,无以至千里;不积小流,无以成江海 595

学Simulink--机器人基础关节控制场景实例:基于Simulink的无刷直流电机(BLDC)关节六步换相位置控制仿真

本文详细介绍了基于Simulink的BLDC六步换相位置控制仿真方法,针对机器人关节的低成本控制需求。重点阐述了霍尔定位、六步换相和位置闭环三大核心原理,通过Simulink建模实现了从霍尔信号处理到位置环控制的全流程。仿真结果表明,该系统可实现0.3°的定位精度和80ms的响应时间,满足教育机器人等应用场景需求。文章还提供了核心代码模块和参数设置方法,并探讨了转矩脉动抑制、无传感器控制等进阶优化方向,为低成本机器人关节驱动提供了实用解决方案。

amy_mhd的博客 152

淋巴结病理数字玻片读取与处理代码

Whole-slide images are generally stored in a multi-resolution pyramid structure. 首先安装openslide模块 pip install openslide-python import os.path as osp import openslide from pathlib import Path...

猫头军师兵书 1276

C++学习笔记(六)(STL顺序容器)

注2:这里的sizeof大小指的是创建容器本身所需要的大小就是member data的大小,而不是指容器内部的元素的大小。各个类型各个版本的编译器有所不同。注1:这张图是为了说明各个容器之间的关系。复合关系是指set里面有一个rb tree作支撑。当有两个class A,B,如果要使A有B的功能,那么有两种方法可以做到:1.A继承自B 2. A拥有一个B。此部分的笔记只涉及小部分源码的解读。

m0_59749585的博客 80

芒果YOLO11改进81:主干Backbone篇之DCNv3结构:即插即用|使用pytorch代码实现,并针对YOLO11专门优化模块

芒果YOLO11改进81:主干Backbone篇之DCNv3结构:即插即用|使用pytorch代码实现,并针对YOLO11专门优化模块

包括YOLOv5、YOLOv7、YOLOv8等模型改进 738

细说 C++ Traits Classes

最近在看侯捷的《STL源码剖析》,看到第三章有关 traits 的介绍,被搞得一头雾水,看了半天不知所云。为了彻底了解这个技法的原理,硬着头皮上网查了资料,并结合 Scott Meyers 的 《Effective C++》,总算是把 traits 的原理搞明白了:)什么是 traits?我们先来看下 C++ 之父的回答: Think of a trait as a small object w

Leo的博客 2万+

保姆级YOLOv8改进 | 基于DWRSeg扩张式残差机制的小目标检测优化(附修改后的C2f与Bottleneck模块)

DWRSeg机制:通过动态权重调整和扩张卷积有效提升了小目标的检测能力。C2f和Bottleneck模块修改:通过集成DWRSeg模块,增强了特征提取和残差学习能力。实验结果:在多个应用场景中,改进后的YOLOv8展现了更高的检测精度,特别是在小目标检测中表现突出。

一键难忘的博客 3217

使用 Fargate 在 AWS ECS 上运行 Spring Boot 应用程序

本文介绍了使用AWS Fargate支持的ECS部署SpringBoot应用的完整流程。主要内容包括:1)将SpringBoot应用打包为Docker镜像并推送至ECR;2)创建任务定义配置CPU、内存和网络等参数;3)设置ECS服务管理任务运行;4)配置负载均衡器分配流量;5)设计VPC网络和安全组规则确保安全访问;6)使用SSM参数存储管理敏感信息。整个过程实现了无服务器化部署,既保持了应用控制权,又免除了基础设施管理负担,是扩展Web服务的可靠方案。

介绍AWS Azure GCP devops Terraform 等技术 512

C++ STL源码剖析 7-traits

在C++中,Traits是一种模板编程技术,它允许我们为不同的数据类型提供统一的操作函数。Traits通常通过模板类和特化来实现,可以在编译时提供类型信息,从而实现类型安全的代码。Traits是一种特性萃取技术,它在泛型编程中被广泛使用。它通过模板类和特化来实现,允许我们为不同的数据类型提供统一的操作函数,如advance、swap、encode/decode等。Traits的实现通常依赖于枚举、typedef和模板的偏特化。// 定义一个通用的 Traits 模板// 默认实现,假设 T 不是特殊类型。

wesigj的博客 1359

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++ STL源码 traits编程

traits,又被叫做特性萃取技术,说得简单点就是提取“被传进的对象”对应的返回类型,让同一个接口实现对应的功能。因为STL的算法和容器是分离的,两者通过迭代器链接。算法的实现并不知道自己被传进来什么。萃取器相当于在接口和实现之间加一层封装,来隐藏一些细节并协助调用合适的方法,这需要一些技巧(例如,偏特化)。最后附带一个小小的例子,应该能更好地理解 特性萃取。   下面大部分来源于《STL源码剖析》,看原书能了解更多细节。 Traits编程技法   让我们一点点抛出问题,然后一点点深入。   1

My_优快云__的博客 538

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

STL 中traits 技术的应用

都说traits 是STL源码的钥匙,那么今天我

dalleny的专栏 1400

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

STL源码剖析(七)traits机制

STL源码剖析(七)traits机制 文章目录STL源码剖析(七)traits机制一、为什么需要traits机制?二、iterator traits2.1 iterator traits的定义2.2 iterator traits相关的函数三、type traits 一、为什么需要traits机制? traits可以称为萃取机,可以通过它来获取迭代器的一些信息,在STL算法中发挥巨大的作用 如下面...

JT同学的博客 848

STL源码分析《4》----Traits技术

STL

L.J.SHOU的专栏 2211

源码剖析:STL中迭代器概念与Traits编程方法

本文深入探讨了STL迭代器的设计思想与实现方法。首先阐述了迭代器作为连接容器与算法的桥梁作用,重点介绍了Traits编程方法这一关键技术。文章详细讲解了五种迭代器类型判断的解决方案:参数类型判断、返回值类型判断、原生指针处理、const元素特化等。通过代码示例展示了iterator_traits结构体的设计与实现,包括value_type、difference_type等关键特性的封装。最后,以advance()和distance()函数为例,说明了如何针对不同迭代器类型设计高效算法。全文系统性地解析了迭代

WildPointer的博客 605

C++ STL源码剖析之Traits编程技法

C++ STL 源码剖析之 Traits 编程技法0.导语在 STL 编程中,容器和算法是独立设计的,即数据结构和算法是独立设计的,连接容器和算法的桥梁就是迭代器了,迭代...

Francis的博客 508

stl源码剖析_C++ STL 源码剖析之 Traits 编程技法

C++ STL 源码剖析之 Traits 编程技法0.导语大家好,我是光城,欢迎关注公众号:guangcity。在 STL 编程中,容器和算法是独立设计的,即数据结构和算法是独立设计的,连接容器和算法的桥梁就是迭代器了,迭代器使其独立设计成为可能。如下图所示:上图给出了 STL 的目标就是要把数据和算法分开,分别对其进行设计,之后通过一种名为 iterator 的东西,把这二者再粘接到一起。设计模...

weixin_39542111的博客 124

stl源码学习之traits技术

这个就是 template的参数推导机制,但是他没办法对返回值进行推导,我们需要其他的机制来解决这个问题,我们可以通过声明内嵌类型来解决这个问题,观察如下代码,我们来简单的推到下, 先看MyIter , 其中的value_type 就是T类型了,好了再返回去砍main,func接受了一个MyIter类型,看到typename I::value_type func(I iter)定义的地方,返回值就变成了MyIter::value_type , 这里就可以判断出返回值就是int了。

weixin_44480265的博客 666

STL源码分析之__type_traits

之前我们对iterator_traits有了一些了解,现在我们要了解__type_traits。 Iterator_traits负责萃取迭代器的特性,__type_traits则负责萃取型别的特性。   对于型别的特性,我们关注的点可能在于对该型别是否需要复杂处理。如果答案是否定的,我们在对这些型别进行构造、析构、拷贝赋值等操作时,就可以采取最有效率的措施,比如不使用析构函数,直接free等

博客 1624
上一篇: STL源码--iterator
下一篇: STL源码--函数对象
wangyanphp
博客等级 码龄14年 90粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值