sgi stl 特性萃取器

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

1 迭代器相关类型的萃取(iterator_traits)

许多算法,如查找,指针移动等都传递的是迭代器,而不同迭代器的型别决定了其算法操作过程的差异

template <class Iterator>
struct iterator_traits {
  typedef typename Iterator::iterator_category iterator_category;
  typedef typename Iterator::value_type        value_type;
  typedef typename Iterator::difference_type   difference_type;
  typedef typename Iterator::pointer           pointer;
  typedef typename Iterator::reference         reference;
};
针对原生指针类型,常量指针类型的的迭代器的萃取偏化版本,注意指针类型的迭代器是随机访问的迭代器
template <class T>
struct iterator_traits<T*> {
  typedef random_access_iterator_tag iterator_category;
  typedef T                          value_type;
  typedef ptrdiff_t                  difference_type;
  typedef T*                         pointer;
  typedef T&                         reference;
};

template <class T>
struct iterator_traits<const T*> {
  typedef random_access_iterator_tag iterator_category;
  typedef T                          value_type;
  typedef ptrdiff_t                  difference_type;
  typedef const T*                   pointer;
  typedef const T&                   reference;
};
萃取函数(注意版本函数调用时不需要模板说明)
萃取迭代器本身类型
inline typename iterator_traits<Iterator>::iterator_category
iterator_category(const Iterator&) {
  typedef typename iterator_traits<Iterator>::iterator_category category;
  return category();
}
注意萃取操作是领用 int()创建临时对象的方法
萃取迭代器间距型别:指针类型
template <class Iterator>
inline typename iterator_traits<Iterator>::difference_type*
distance_type(const Iterator&) {
  return static_cast<typename iterator_traits<Iterator>::difference_type*>(0);
}
萃取迭代器所指类型:以指针进行标识
template <class Iterator>
inline typename iterator_traits<Iterator>::value_type*
value_type(const Iterator&) {
  return static_cast<typename iterator_traits<Iterator>::value_type*>(0);
}
2__type_traits数据型别的特性萃取器
意在萃取数据类型是否是POD数据型别,是否拥有trivial构造函数,拷贝函数等,赋值=,析构

基本类型,保证最低级别的设置
template <class type>
struct __type_traits {
   typedef __true_type     this_dummy_member_must_be_first;
                   /* Do not remove this member. It informs a compiler which
                      automatically specializes __type_traits that this
                      __type_traits template is special. It just makes sure that
                      things work if an implementation is using a template
                      called __type_traits for something unrelated. */

   /* The following restrictions should be observed for the sake of
      compilers which automatically produce type specific specializations
      of this class:
          - You may reorder the members below if you wish
          - You may remove any of the members below if you wish
          - You must not rename members without making the corresponding
            name change in the compiler
          - Members you add will be treated like regular members unless
            you add the appropriate support in the compiler. */


   typedef __false_type    has_trivial_default_constructor;
   typedef __false_type    has_trivial_copy_constructor;
   typedef __false_type    has_trivial_assignment_operator;
   typedef __false_type    has_trivial_destructor;
   typedef __false_type    is_POD_type;
};
其后为偏化版本,包括了全部的built-in 类型,与原生指针类型
template <class T>
struct __type_traits<T*> {
   typedef __true_type    has_trivial_default_constructor;
   typedef __true_type    has_trivial_copy_constructor;
   typedef __true_type    has_trivial_assignment_operator;
   typedef __true_type    has_trivial_destructor;
   typedef __true_type    is_POD_type;
};

实例:给定迭代器的范围,首先萃取出迭代器所指即容器元素类型,其后根据类型判断类别是否有必要调用构造函数进行对象的析构过程

// 利用 value_type 萃取容器元素类型,注意类型以指针标识
template <class ForwardIterator>
inline void
__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) {
  for ( ; first < last; ++first)
    destroy(&*first);
}

利用 __type_traits 萃取类型是否有必要的析构函数
template <class ForwardIterator> 
inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {}

// 有必要的析构函数, 对每一个元素进析构
template <class ForwardIterator, class T>
inline void __destroy(ForwardIterator first, ForwardIterator last, T*) {
  typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor;
  __destroy_aux(first, last, trivial_destructor());
}

// 没有必要的析构函数不用处理template
template <class ForwardIterator>
inline void destroy(ForwardIterator first, ForwardIterator last) {
  __destroy(first, last, value_type(first));
}

REF:STL源码剖析

简述STL萃取 萃取相当于对迭代的功能扩展,有了它让我们得以通过迭代获得迭代所指的数据的类型。 现在假设我们要实现一个算法,它接受一个迭代作为参数,算法中需要定义一个变量,类型为迭代所指的数据的类型。 对于这个问题,我们并没有什么好办法,C++没有typeof()这种东西,typeid()也只能获得关于类型的信息,并不能用来声明变量。 不过我们还是可以仰仗function templete的参数... 阅读详情

相关推荐

STL源码分析--萃取编程(traits)技术的实现

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

鱼思故渊的专栏 3892

C++ STL的Traits 特征萃取

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

JackZhangNJU的专栏 1353

STL迭代的"特性萃取机"-----Traits

Traits就像一台”特性萃取机“,它可以毫无偏差的榨取各个迭代特性。在讲Traits之前,我们先要把迭代特性搞清楚。 什么是迭代特性? 迭代特性就是迭代的型别,最常用的迭代的5中种型别(这5种型别都为内嵌型别),每一种迭代都有以下五种型的定义: 1.value_type 迭代所指向对象的类型 2.difference_type 表示两个迭代之间的

LLZK_的博客 2187

STL之迭代

1、基本概念   迭代,是一种抽象的设计模式,主要是提供一种方法,使之能够依序巡防某个聚合物所含的各个元素,而又无需暴露该聚合物的内部表述方式。STL想要将容和算法分开,达到泛化的目的,就需要迭代作为其中的胶着剂。

小木木的博客 478

C++类型萃取(traits)技术

STL简述 STL(Standard Template Library)是C++泛型编程(template技术)的集大成者, 迭代STL中发挥重要的作用. 在STL中有3个重要的概念: 容:包括顺序容(vector, list)和关联容(map, set) 算法:各种操作容的函数模版(count, count_if) 迭代:作为算法和容的桥梁, 让算法独立于容发展...

QQ2558030393的博客 2457

STL基础知识 简介

STL 基础知识简介

weixin_53332395的博客 3万+

stl萃取机制

stl类型萃取机制

weixin_45157276的博客 313

SGI-STL 迭代实现

SGI-STL 迭代实现 迭代模式:该模式能够提供一种方法,使之能够依序寻访某个聚合物(容)所含的每个元素,而又无需暴露该聚合物的内部表达方式。 ———————————————————————————————————————— 《STL源码剖析》 它是什么?它其实就是算法与容的一种粘胶剂。它像什么?迭代的行为非常类似智能指针(SmartPointer),所以对他来说最重

蔡曜镫专栏 954

判断void*参数类型_C++|深入理解STL类型萃取机制(type traits)

我们知道Traits是C++语言的一种高级特性STL首先利用Traits技术对迭代特性做出规范,制定出iterator_traits(参考:STL算法如何萃取(traits)迭代型别(value_type)?)。后来SGI STL把它应用在迭代以外的地方, 就有了type_traits。函数、类或者一些封装的通用算法中的某些部分会因为数据类型不同而导致处理或逻辑不同(而我们又不希望因为数...

weixin_39627361的博客 335

我读STL源码剖析(1)

学习编程的人都知道,阅读、剖析名家代码乃是提高水平的捷径。源码之前,了无秘密,尤其是为了效率无所不用其极的SGI STL。大师们的缜密思维、经验结晶、技术思路、独到风格,都原原本本体现在源码之中。在你仔细推敲之中,迷惑不解之时,恍然大悟之际,你的经验、思维、视野、知识乃至技术品位都会获得快速的成长。          而作为一个喜欢追求事物内在原理、理论的人,这本书无疑很适合的。于是这本书在书柜

无题 1286

STL源码剖析:从组态、类型萃取到内存分配的底层实现

C++标准模板库(STL)是泛型编程的核心组件,其设计哲学建立在类型安全、性能优化和可移植性之上。理解STL的底层实现原理,需要从编译适配、模板元编程和内存管理等基础概念入手。类型萃取(Type Traits)作为模板元编程的关键技术,允许在编译期获取类型属性,为算法选择最优实现路径,例如在`std::copy`中根据POD类型判断是否使用`memcpy`。内存分配(Allocator)则抽象了内存管理,分离对象构造与内存分配,通过`placement new`和类型萃取实现高效资源管理。这些机制共同支

weixin_30385925的博客 352

类型萃取(type traits)

1. 类型萃取的作用 类型萃取使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来提高效率或者其他。例如:在STL中的destory算法根据函数的参数类型的特性:是否有trivial destructor来选择对应的策略来进行destory,如果为内置类型,则不调用该类型的destructor,否则对...

aqjh9999的博客 181

【C++】STL学习之旅——初识STL,认识string类

本文介绍了C++中的STL库,并初步讲解了string类

叫我龙翔的博客 2004

如何让算法扩展适用于STL标准

前言         从事过一段时间的程序开发后,对于以后要干什么总算也有了短期的目标。如今的软件行业在互联网至上的大趋势下,很多“程序员”(可能也包括我自己)与其称之为程序员,不如说是码农,大公司大企业封装好了各种框架,特别是各种Java的强大框架让程序开发越来越傻瓜化,在这样的工作环境中,我感觉我反复已经看到了20年后的自己。经历了崇尚各种看起来高大上的各种花哨东西(曾迷恋过各种好看的

426

STL学习笔记1

1.STL六大组件 1.容(containers):存放数据,如vector、list、deque、set、map 2.通用算法(algorithms):如sort、search、copy、erase. 3.迭代(iterator):迭代分为五种input迭代,output迭代、正向迭代(哈希表)、双向迭代(list 、map、set)、随机迭代(vector和双端队列)。(栈队列...

qq_42111463的博客 395

SGI STL迭代概念与traits编程技法

《Design Patterns》一书提供有23个设计模式的完整描述,其中 iterator模式定义如下: 提供一种方法,使之能够依序巡访某个聚合物(容)所含的各个元素,而有无需暴露该聚合物的内部表达方式。 ===> (迭代可用于遍历访问容中的元素,而又无需关注容中的元素的类型。) 1. 迭代设计思维 ---- STL 关键所在: STL的中心思想在于: 将数据容(containers)和算法(algorithms)分开,彼此独立设计,最后再以一帖胶着剂将它们撮合在一起。 ===>

ArtAndLife的博客 397

SGI STL顺序容 vector

目录在SGI STL中,vector和array都是数组容,两种操作非常相似。区别在于:array是静态空间,一旦配置就不能改变;vector是动态空间,随着新元素加入,内部机制或自行扩充空间以容纳新元素。vector维护的是一个连续线性空间,不论元素类型是什么,普通指针都可以作为vector的迭代而满足所有必要条件,因为vector需要的操作:operator*,operator->,operatro++, operator--, operator+, operator-, operator+=, o

木牛的博客 340
上一篇: sgi stl 迭代器的设计
下一篇: DirectX 游戏编程之游戏框架
@LDLAN
博客等级 码龄15年 12粉丝 49原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值