STL Traits编程技法】的更多相关文章

traits编程技法大量运用于STL实现中.通过它在一定程度上弥补了C++不是强型别语言的遗憾,增强了C++关于型别认证方面的能力. traits编程技法是利用“内嵌型别”的编程技法和编译器的template参数推导功能实现的. iterator_traits 1.对于class type要求其“内嵌型别” 要求与STL兼容的容器,其迭代器必须定义一下五种型别: iterator_category 迭代器类型 value_type 迭代器所指对象类型 difference_type 迭代器间的距…
第一部分 iterator学习 STL iterators定义: 提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式. 任何iteartor都应该提供5个内嵌相应型别: 1. value_type; 2. difference_type; 3. pointer; 4. reference; 5. iterator_category; 下面分别介绍5个内嵌型别: 1. value_type: 由于是泛型编程,因此容器中的数据类型并不能确定,如一个函数…
1.准备知识 typename用法 用法1:等效于模板编程中的class 用法2:用于显式地告诉编译器接下来的名称是类型名,对于这个区分,下面的参考链接中说得好,如果编译器不知道 T::bar 是类型名的话 T::bar * p可能就被理解成了T::bar 乘以p,T::bar & p可能就被理解成为了 T::bar 和p做逻辑与操作. 事实上,在模板编程时,如果传入的模板参数为T(T里面有模板参数的非独立名字bar),那么在不显示指定的话,c++或假定T::bar为变量名以消除歧义. "…
最近在看读<STL源码剖析>,看到Traits编程技法这节时,不禁感慨STL源码作者的创新能力.那么什么是Traits编程技法呢?且听我娓娓道来: 我们知道容器的许多操作都是通过迭代器展开的.其中容器类似于数组,迭代器类似于指针.我们用数组来写个例子: ] = {,,,,}; int *p; p = &arr[]; 假设,我将第1.2遮挡起来,问你p所指向的对象arr[2]是什么类型,你恐怕无法回答.因为它可以是int,char,float甚至你自己定义的类型.假设我们现在是个容器:…
一.迭代器 1. 迭代器设计思维——STL关键所在 在<Design Patterns>一书中对iterator模式定义如下:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式. STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以一贴胶着剂将它们撮合在一起.容器和算法的泛型化,从技术角度来看并不困难,C++ 的class templates 和 function templates…
摘要 主要讨论如何获取迭代器相应型别.使用迭代器时,很可能用到其型别,若需要声明某个迭代器所指对象的型别的变量,该如何解决.方法如下: function template的参数推导机制 例如: template<typename I, typename T> void func_impl(I iter, T t) { //T为迭代器所指对象的型别 T tmp; //..... } template<typename I> inline void func(I iter) { //f…
在算法中运用迭代器时,很可能用到其相应类型.什么是相应类型?迭代器所指对象的类型便是其中一个.我曾有一个错误的理解,那就是认为相应类型就是迭代器所指对象的类型,其实不然,相应类型是一个大的类别,迭代器所指对象的类型只是里面的其中一个.后面会讨论到相应类型的另外几种. 假设算法需要声明一个变量,以“迭代器所指对象的类型”为类型,该怎么做?或许我们可能会想到RTTI性质中的typeid(),但获得的只是类型名称,并不能拿来声明变量. 其中一个解决方法是:利用模版函数中的参数推导(argument d…
traits编程技法利用了“内嵌型别”的编程技巧与编译器的template参数推导功能. 下面主要看看利用traits编程技法实现的迭代器萃取机制. 5种迭代器类型定义: struct input_iterator_tag {}; struct output_iterator_tag {}; struct forward_iterator_tag : public input_iterator_tag {}; struct bidirectional_iterarot_tag : public…
大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub : https://github.com/rongweihe/MoreThanCPlusPlus 已经收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎 star 和完善.一起加油,变得更好! 前言 上一篇,我们剖析了 STL 空间配置器,这一篇文章,我们来学习下 STL 迭代器以及背后的 traits 编程技法. 在 STL 编程中,容器和算法是独立设计的…
STL中,traits编程技法得到了很大的应用,了解这个,才能一窥STL奥妙所在. 先将自己所理解的记录如下: Traits技术可以用来获得一个 类型 的相关信息的. 首先假如有以下一个泛型的迭代器类,其中类型参数 T 为迭代器所指向的类型: template <typename T>class myIterator{ ...}; 当我们使用myIterator时,怎样才能获知它所指向的元素的类型呢?我们可以为这个类加入一个内嵌类型,像这样:template <typename T>…
看了候哥的<STL源码剖析>的迭代器那一章,在这里将思路稍微疏理一下 迭代器 迭代器模式的定义:提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素. 迭代器在STL中得到了广泛的应用,通过迭代器,容器和算法可以有机的粘合在一起,只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作.也就是说,数据容器和算法是分开的. 独立的迭代器并不能满足我们的要求,在实现独立的迭代器时无可避免的会暴露出容器中的很多内容,所以STL将迭代器的实现交给了容器,每种容器都…
最近在看STL源码解析的迭代器(iterators)一章,涉及到c++ Traits的编程技法,刚开始看时一头雾水,反复看了好几遍之后才理解这个东西,因此来写写在这方面的理解,如有错误,希望读者指正. 1.迭代器(iterators) 在设计模式中,将迭代器进行如下定义:提供一种方法,使之能够依序寻访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式. 2.迭代器的设计思维 STL的设计思想在于:将容器和算法分离开来,彼此独立设计,最后在以一帖胶着剂撮合在一起,这个胶着剂就是迭…
前言 这段时间研读SGI-STL-v2.91源码,并提炼核心代码自己实现一遍,感觉受益颇深.觉得有必要写一些文章记录下学习过程的思考,行文旨在总结,会大量参考侯捷<STL源码剖析>的内容. 迭代器概述 迭代器定义:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而无需暴露该聚合物的内部表述方式. STL的中心思想在于:将数据容器和算法分开,彼此独立设计,然后再以一贴胶着剂撮合在一起.在STL中,迭代器就扮演着胶着剂的作用.迭代器是一种类似指针的对象,而指针的各种行为中最常见也是…
本文从三方面总结迭代器   迭代器的思想   迭代器相应型别及traits思想   __type_traits思想 一 迭代器思想 迭代器的主要思想源于迭代器模式,其定义如下:提供一种方法,使之能够依序巡防某个聚合物(容 器)所含的元素,而又无需暴露该聚合物的内部表达式.可见她的主要作用便是能够降低耦合,提高代码的 模块性. STL的的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再以一贴胶着剂将它们撮合 在一起,这贴胶着剂便是迭代器.迭代器的行为类似智能指针(例如标准库的auto_pt…
看了<stl源码剖析>中关于traits的部分,由于对模板还不是很熟悉,就看了一下还未完工的C++ Template 进阶指南 ,感觉收获很大,推荐一下. 在使用迭代器时,为了知道它的相应类型,可以使用模板的参数推导,代码如下 template <class T> struct MyIter typedef T value_type; T* ptr; MyIter(T* p=) : ptr(p) { } T& operator*() const { return *ptr;…
//迭代器是一种smart pointer template<typename T> class ListItem { public: T value() const { return _value; } ListItem* next() const { return _next; } private: T _value; ListItem *_next; }; template<class T> class List { public: void insert_front(T v…
侯捷老师在<STL源码剖析>中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘.如此一说,其重要性就不言而喻了.      之前已经介绍过迭代器,知道了不同的数据结构都有自己专属的迭代器,不同的迭代器也有不同的特性,由于算法的接口是统一的,通过迭代器的不同属性,算法自动选择正确的执行流程,在完全任务的同时,也尽可能提高算法的执行效率.那算法如何获知迭代器的属性呢?这一光荣的任务就是traits完成的.在STL实现中,traits编程技术得到大量的运用…
上节给出了iterator_traits以及用到traits机制的部分函数的完整代码,可以看到traits机制能够提取迭代器的特性从而调用不同的函数,实现效率的最大化.显然这么好的机制不应该仅局限于在STL里面使用,在前某一节中我们也有说到,traits机制能够萃取类的特性,而这个类分为两个类别,一是迭代器类,二普通类,迭代器类我们已经有所了解了,那么本节就来学习负责萃取普通类型特性的__type_traits吧. 于普通类型而言,我们所关注的特性是指:这个类型是否具备non-trivial d…
1 STL迭代器原理 1.1  迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(iterator)就是这个桥梁. 1.2  迭代器(iterator)类型 1.3 迭代器功能说明 迭代器类别          说明 输入 从容器中读取元素.输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍算法,同一  个输入迭代能两遍遍历一个序列 输出   向容器中写入元素.输出迭代器…
目录 内存分配和释放 对象的构造和析构 traits要解决的问题 内嵌类别声明解决非指针迭代器的情况 使用模板特例化解决普通指针的情况 迭代器相应类别 内存分配和释放 STL中有两个分配器,一级分配器和二级分配器,默认使用二级分配器,使用二级分配器分配大内存时会调用一级分配器去执行,一级分配器使用malloc和free分配和释放内存.如果分配小内存那么二级分配器会从内存池中进行查找,防止malloc/free的开销. 为了了解原理,不深挖细节,只实现一级分配器也是可以的: class first…
可以直接利用STL中定义好的traits_iterator来萃取 /*特性萃取器*/ template <class unknown_class> struct unknown_class_traits { typedef typename unknown_class::return_type return_type; }; /*特性萃取器 —— 针对原生指针*/ template <class T> struct unknown_class_traits<T*> {…
本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Templates  15章节 :网络资料: http://blog.csdn.net/my_business/article/details/7891687 1.定义: 函数,类或者一些封装的通用算法中的某些部分会因为数据类型不同而导致处理或逻辑不同(而我们又不希望因为数据类型的差异而修改算法本身的封装时).traits会是一种很好的解决方案. 助教提示: 1.不要像用switch一样枚举各个类型,用traits用模板实现.…
在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (int i = 0 ; i < n ; i++) { sum += *a++; } return sum; } //对于listNode类的求和函数 struct ListNode { int val; ListNode * next; }; int sum(ListNode * head) { int…
1.为什么要出现? 依照默认认定.一个模板给出了一个单一的定义,能够用于用户能够想到的不论什么模板參数!可是对于写模板的人而言,这样的方式并不灵活.特别是遇到模板參数为指针时,若想实现与类型的參量不一样的实例化.就变得不太可能了!也有时.想禁止此种同样的实例化变得不太可能! 故而出现了,Partial Specialization! 同一时候,在使用void*指针时.能够最大限度的共享代码,降低代码的膨胀! 2.它是什么?事实上,就是用户定义的偏特化.用template<>来说明这是一个偏特化…
提要 先看一段用迭代器的代码: int a[] = {1, 2, 3, 4, 5}; vector<int> v1( a, a+5); vector<int>::iterator iter = v1.begin( ); for (; iter != v1.end( ); ++iter) { cout << *iter << " "; } cout<<endl; STL的中心思想在于:将数据容器(containers)和算法(a…
迭代器模式 提供一种方法,使之能够依序访问容器的各个元素,而又无需暴露容器的内部表述方式 STL设计的中心思想在于将数据容器和算法分离开,容器和算法分开设计,迭代器则是两者之间的胶着剂,一般迭代器的设计与容器细节相关,所以一般交给容器的设计者 迭代器相应型别 如何"获取迭代器的所指对象的型别"? 可以借助参数推导,但函数的返回值是无法推导的,如果声明内嵌型别typedef T value_type,那么对于原始指针就无法定义其内嵌型别,这时候模板偏特化可以做到 偏特化与traits 泛…
1. Stl的设计思想是: 将数据容器和算法分开,彼此独立设计,最后再以一贴胶合剂将它们撮合在一起,这个胶合剂就是迭代器. 2. 从3.2节迭代器的实现可知,如果要设计一个与容器分离实现的迭代器,会暴露太多容器实现的细节,也就是说,要设计出针对某个容器的迭代器,必须对容器的实现细节非常了解, 所以就将容器的实现细节交给容器设计者,专属迭代器的实现成为容器的一部分,所以每个Stl容器都有提供专属的迭代器. 3. 迭代器是一种行为类似指针的对象,而指针的各种行为中最常见也最重要的便是内容提领和成员访…
前言 traits,又被叫做特性萃取技术,说得简单点就是提取"被传进的对象"对应的返回类型,让同一个接口实现对应的功能.因为STL的算法和容器是分离的,两者通过迭代器链接.算法的实现并不知道自己被传进来什么.萃取器相当于在接口和实现之间加一层封装,来隐藏一些细节并协助调用合适的方法,这需要一些技巧(例如,偏特化). 下面大部分来源于<STL源码剖析>,看原书能了解更多细节. Traits编程技法 让我们一点点抛出问题,然后一点点深入. 1. 首先,在算法中运用迭代器时,很可…
源码之前,了无秘密. --侯杰 第三章:迭代器概念与traits编程技法 迭代器是一种smart pointer auto_Ptr 是一个用来包装原生指针(native pointer)的对象,声明狼藉的内存泄漏问题可藉此获得解决. auto_ptr用法如下,和原生指针一模一样: void func() { auto_ptr<string> ps(new string("jjhou")); cout << *ps << endl; //输出:jjho…
一.算法概观 以有限的步骤,解决逻辑或数学上的问题,这一专门科目我们称为算法.特定的算法往往搭配特定的数据结构,例如binary search tree(二叉搜索树)和 RB-tree 便是为了解决查找问题而发展出来的特殊数据结构.几乎可以说,特定的数据结构是为了实现某种特定的算法.本章所讨论的,是可施行于“无太多特殊条件限制”之空间中的某一段元素区间的算法. 1. 算法分析与复杂度表示O() 参见算法与数据结构相关书籍,如<算法设计与分析><数据结构>等. 2. STL 算法总览…