标准库的容器、迭代器、适配器、仿函数(函数对象)和算法都是用模板类和模板函数实现的。
第一篇 泛型编程导入

一、A Tour of the STL

1.读取标准输入排序并输出的例子(读文本排序和建立字符串表用指针排序,利用泛型算法、泛型指针、泛型容器和function object);

二、Algorithms and Ranges

算法通过作用于一个区间的iterator来实现适应于不同数据结构的容器。
1.线性查找(C语言的strchr函数实现以指针累增查找,find1函数指针自增,区间(Range)的左闭右开设计,rangefind2与find函数,find函数作用于链表时需要给链表加外覆类);
2.concepts和modeling(concepts定义为某一类类型共同具有的性质,如Input Iterator,而model表示一个特定的类型,如char*,这类性质是为适用于同一算法运算如find而必须具有的性质);
3.Iterators(迭代器,泛型指针)(类似于指针,迭代器是用来指向对象的一种对象,是算法与数据结构之间的接口,能以线性顺序遍历某个数据结构,Input Iterator:输入迭代器作为一个concept与指针相比具有和不具有的性质;Output Iterator:输出迭代器也是和输入迭代器类似的一种concept,限制也与input iterator类似;Forward Iterator:与输入、输出迭代器相比前向迭代器具有不一定线性遍历的特性,且可以没有不能修改的限制,可以由两个迭代器用作比较,可以multipass,注意const的顶层和底层;Bidirectional Iterator:与Forward Iterator类似,支持向后/自减操作;Random access Iterator:与前面所述迭代器相比可以有加减常数、下标、迭代器相减和比较次序操作,支持操作更多,但对于某些数据结构有些操作意义不大);
4.Refinement(精炼、强化)(如果concept2提供concept1所有功能,而且提供额外功能,则认为concept2是concept1的一个refinement,如bidirectional iterator对于forward iterator,适用于concept1的model的算法一定适用于concept2;model是type与concept(types)之间的关系,refinement是concepts之间的关系;继承和多态不能实现concept与model之间的关系);
5.总结(不同的iterator concepts之间阶层关系;nonmodifying和mutating算法之间区别是一个使用constant iterator,一个使用mutable iterator);

三、More about Iterators

1.  Iterator Traits(迭代器特征)与Associated Types(相关型别)(每种concept的迭代器都有一些相关型别,而iterator traits包含了公有的相关型别value types,difference types,reference type和pointer type,iterator category);
1.1)  Value type(数值型别)(iterator traits提供value type属性表示iterator所指向的变量型别,如定义函数返回类型为typename iterator_traits<InputIterator>::value_type);
1.2)  Difference type(差距型别)(iterator traits提供difference type属性表示两个iterator相减的变量型别);
1.3)  Reference type和Pointer type(iterator traits提供reference和pointer属性表示引用或指针的变量型别);
1.4)  算法的处理与Iterator tags(如同在advance函数中一样,iterator traits提供Iterator tags属性表示用以重载时匹配五种不同的iterator concept);
1.5)  把一切统合起来(当你设计自己的iterator或算法时,你可能需要返回value type、difference type、reference type或者pointer type的某个变量,或者需要针对不同的iterator concept做重载,这时你必须考虑iterator traits的五个特性,标准模板库有一个base class iterator可以提供继承方便你的设计);
1.6)  没有iterator traits,如何制作iterator traits(旧版本的库函数只提供一组iterator查询函数:distance_type、value_type和iterator_category);
2.  定义新组件(STL允许自己扩充新iterator或着新算法,但iterator必须满足iterator concepts的特性,主要有必须指向某物、可以遍历某个区间、可以*和++运算,但需要注意的一点是iterator必须正确地对应为constant或mutable,一个例子是node_wrap,要定义constant和mutable两个版本);
2.1)  Iterator Adapters(适配器是将一种接口转换成为另外一种接口以适应算法或其它STL组件的要求,STL定义了一些迭代器适配器如front_insert_iterator、back_insert_iterator和reverse_iterator);
2.2)  定义Iterator时的建议(定义时注意iterator是constant或者mutable的,iterator traits需要正确作用,尽可能提供较多的iterator行为,forward iterator应遵循相等比较);
2.3)  定义算法时的建议(尽可能做最少的假设,设计为对input iterator和output iterator可用,效率和一般化之间用分派技术解决,测试时不会疏忽,注意空区间);
3.  总结(STL的思想是作用于range之上的泛型算法,5个iterator concepts是算法与容器之间的粘胶);

四、Function Objects

函数对象是指重载了函数调用运算符的对象,就可以直接使用"对象名()"的方式对重载()的成员函数进行调用。
1.  将线性查找一般化(find函数比较相等性时比较是否全等,更一般化的选择是find_if,对于find_if,你需要传入一个function object,一般的选择是函数指针,但也可以用一个类或者模板类,该类中重载函数运算符()的成员函数用作判断条件);
2.  Function object concepts(函数对象概念)
2.1)  单参(Unary)与双参(binary) function objects(还有无参 function objects);
2.2)  Predicates与Binary Predicates(单一引数并返回true或false的function objects,称为Predicates,这是Unary Function的一个强化;两个引数并返回true或false的function objects,称为Binary Predicates;transform和find_if对比);
2.3)  相关型别(Associated Types)(function objects的相关型别就是它的引数和返回值的型别,若需要指明相关型别,则需使用adaptable function objects);
3.  Function Object Adapters(函数对象适配器)(adapters是一组将某种接口转换成另外一种接口的东西,如unary_negate(f)用于对f反相,not1函数可以作用于函数或函数对象上返回该函数的反相,可用pointer_to_unary_function将函数指针转换为adaptable unary function,pointer_to_binary_function供双参函数使用,binder1st与binder2nd可将adaptable unary function转换为unary function,mem_fun_t adapter作用于member function,unary_compose将f和g合成为h=f(g));
4.  预定义的Function objects(预定义的STL数值运算function objects有plus、minus、multiplies、divides、modulus和negate;预定义的STL比较运算function objects有equal_to、not_equal_to、greater、less、greater_equal和less_equal);
5.  总结(function objects通常只有一个member function operator(),没有member variable,function objects的存在使得泛型算法更加一般化);

五、Containers

1.  一个简单的container(数组优点:遵循range概念,分配在栈内,访问效率,固定大小,初始化方便;数组缺点:没size()概念,past-the-end iterator必须由第一个迭代至最后一个访问,无复制操作,无法以 by value方式传递数组);
1.1)  一个array class(block/c_array模板类定义及定义内的嵌套型别);
1.2)  它是如何运作的(block模板类元素个数不可变,没有constructor、destructor和assignment操作符,成员都是public);
1.3)  最后讨论(block模板类==与<比较操作符的实现,begin、rbegin与end、rend的实现,swap、max_size和empty成员函数);
2.  Container Concepts(container concept包含的三个主要功能:包含元素、提供访问元素的办法和支持让container成为regular type所必须的一些操作行为);
2.1)  元素的容纳(containers不能重叠,元素生命期不能超过所属container的生命期,container可以大小可变);
2.2)  Iterators(有三种方式可以访问block的元素:iterator和const_iterator、reverse_iterator和reverse_const_iterator、A[n]);
2.3)  Containers的阶层架构(根据iterator的阶层关系,containers也有阶层关系如下,container—>forward container—>reversible container—>random access container);
2.4)  最平淡无奇的container(trivial_container : range永远为空,大小永远为0的container);
3.  大小可变的Container Concepts(STL包含两种大小可变的Container:Sequence container和Associative container);
3.1)  Sequences(序列)(Sequence container即线性容器,以线性顺序排列容器,都有member function insert和erase;三种典型的sequence container,vector、list和deque存储形式及其insert和erase;安插于开头或结尾,front、back、push_front、push_back;安插(insert)语义与覆盖(overwrite)语义,copy算法使用的是overwrite方式,用iterator adapters实现insert);
3.2)  Associative Container(关联式容器)(Associative container的每一个元素都有一个对应的key,基本操作是查找(lookup)、安插(insertion)和消除(erasure);associative container有三种分类方法。(1)Associative container有value_type和对应的key_type,有两种Associative container,一种simple associative container,其元素的key就是元素自身,一种pair associative container,其value是一个pair<const key,T>,而key是这个pair的第一个字段;(2)unique associative container不允许不同的value有相同的key,而multiple associative container允许不同的value有相同的key;(3)associative container至少有两个不同的refinement,用以组织元素,一个hashed associative container,一个sorted associative container。Associative container的member function,insert、erase、find和count);
3.3)  Allocators(配置器)(很多containers以动态内存分配,STL 容器允许以template参数的方式指定allocator);
4.  总结(containers阶层架构,containers泛型算法设计);
4.1)  Containers选择(尽量先考虑使用简单一点的containers,从vector或block考试考虑,再考虑list);
4.2)  设计你自己的container;

第二篇 参考手册:STL concepts

六、Basic concepts

1.  Assignable(若能够复制某个型别的object,并且可以将该数值赋值到该型别别的变量上,这个型别是assignable的);
2.  Default Constructible(该型别有一个default constructor,即我们不需要指定任何值,就可以构造该型别的object,那么这个型别的default constructible的);
3.  Equality Comparable(可以使用operator==来对某个型别的两个object进行相等比较,则该型别是equality comparable);
4.  可序性(一种lessthan comparable,须能够以operator < 作为比较动作,而operator必须定义出某种一致的可序性;一种strict weakly comparable,此时operator < 除了满足partial ordering条件,还满足更严格的strict weak ordering条件,即该object中任一变量都不小于另一object中任一变量);

七、Iterators(迭代器/泛型指针)

Iterators是STL的核心,它们是泛型化的指针,是指向其它objects的objects,能够遍历objects所形成的range。Iterators让我们得以将容器(containers)与作用其上的算法(algorithm)分离(理解时将其作为泛型的指针来理解,认为迭代器是一种模板类,该模板类以指针作为其主要成员,但外覆了一些操作容器的特性)。
1.  Trivial Iterator(是一种可提领,使得以取用某个object的concept,它不必支持数值运算如比较或累加,使你在创建新的iterator时可以继承的基类);
2.  Input Iterator(可提领,能够取用某个object,支持累加以获取序列中的下一个iterator,不一定是mutable,不一定得支持惯常的提领语义用以容许多回multipass算法);
3.  Output Iterator(提供一种机制,用以存储数值序列,但不必提供取出数值的方法。Output iterators在某些情况下与input iterators相反,不过它们的接口更受束缚。不必一定支持成员访问或相等比较,也不必拥有相关型别difference type和value type;和input iterator一样不支持多回,不保证你能访问同一个Output Iterator两次);
4.  Forward Iterator(可应用于多回算法,只允许向前(range尾端)移动,其model types可以是mutable或constant);
5.  Bidirectional Iterator(既可以累加++,也可以递减- -);
6.  Random access Iterator(可以累加也可以递减的iterator,支持+,+=,-,-=,<以及[ ]索引);

八、Function objects(函数对象)

Function Object或称为Functor,是一种能以一般的函数调用语法来调用的object,Function pointer(函数指针)是一种function object,所有具有operator() member function的objects也都是function object。基本的function objects概念:Generator、Unary Function和Binary Function,其中返回为bool的Unary Function称为Predicate,返回bool之Binary Function称为Binary Predicate。Adaptable function object可以指定引数及返回值型别,而且可以包含嵌套型别声明,好让这些型别可以被命名以及被程序使用;Adaptable function objects之所以称为“adaptable”,是因为它们可用于function object adapter,它们是能够被转换为或被用来操作其它function objects的一种function objects。
1.  基本的Function Objects(Generator:凡一个函数能够返回某值,而且不需要任何参数,它便是一个Generator;
          Unary Function:凡一个函数能够返回某值,而且需要单一参数,它便是一个Unary Function;
          Binary Function:凡一个函数能够返回某值,且需要两个参数,它便是一个Binary Function);
2.  Adaptable Function Objects(Adaptable Generator:是一种嵌套定义其result type的Generator,这个嵌套定义使我们得以运用function object adapter,STL并没有给出Adaptable Generator;
          Adaptable Unary Function:是一种定义了argument type和result type的Unary Function,定义一个Adaptable Unary Function之model type时,你必须定义其嵌套类别,最简单的做法是让它继承base class unary_function,STL中的Adaptable Unary Function有negate、identity和pointer_to_unary_function;
          Adaptable Binary Function:是一种嵌套定义argument type和result type的一种Binary Function,当你想要定义一个Adaptable Binary Function的model type,你必须提供那些嵌套定义,最简单的做法是继承base class binary_function,STL预定义的adaptable binary function包括plus、multiplies、less、equal_to、pointer_to_binary_function等);
3.  Predicate(Predicate:是一种unary function,需要单一参数,并且返回true或false的函数就是Predicate;
          Binary Predicate:是一种Binary function,其结果表现出某条件的真与假,接受两个参数,STL中有bool (*)(int,int)、equal_to和less_equal等;
          Adaptable Predicate:是一种Predicate,也是一种adaptable unary function,即它是一种返回值型别可以转换为bool的unary function,并且嵌套定义了argument type和return type。STL中的adaptable predicate有logical_not和binder1st<equal_to>等;
          Adaptable Binary Predicate是一种Binary Predicate,也是一种adaptable binary function,即它是一种返回值型别可以转换为bool的binary function,并且嵌套定义了argument type和return type。STL中的adaptable binary predicate有less、greater、equal_to和logical_and等;
          Strict Weak ordering:是一种Binary Predicate,可用来比较两个objects);
4.  特化的Concepts(Random Number Generator:是一种function object,可用来产生整数随机数列,若f是一个Random Number Generator,则f(N)返回一个小于N且大于大于等于0的整数,如果以同一个N多次调用f,产生的数列在range[0,N)中将是均匀分布;
          Hash function(散列函数):是一种unary function,用在Hashed Associative Container中,它接收单一参数,并将该参数映射至型别为size_t的结果,STL中唯一一个hasn function是class hash);

九、Containers(容器)

Container是一种object,可以包含并管理其它objects,并提供iterators用以定址其所包含之objects元素。有三种广泛类型,一是极为一般化的Container concept;二是Sequence container concept,可动态调整大小;三是Associative container concept,特别针对以值查询元素的情况进行优化。某些containers以其内存分配方式作为参数,其中很多使用Allocator concept。
1.  General container concepts(@1 Container:是一种(模板)object,能够存储其它objects作为元素,并拥有访问元素的方法,每一个container model都具有一个相关的iterator型别,用来遍历元素;
          @2 Forward Container:元素依明确次序规则来排列的container,这个次序不会在迭代过程中自行改变,其对应的iterator是Forward iterator,因此它支持多回算法。STL中的Forward container有vector、list、slist、deque、set、hash_set、map、hash_map、multiset、hash_multiset、multimap和hash_multimap等;
          @3 Reversible container:是一种forward container,且其iterator是一种bidirectional iterator,它拥有额外的一些member functions和嵌套型别,不但可以向前遍历,也可以向后遍历,STL中实例包括vector、list和set等;
          @4 Random access container:是一种reversible container,且其iterator是一种random access iterator,它提供在amortized constant time访问任意元素的方法,可由iterator或者operator [ ] member function直接访问,STL中实例包括vector和deque等,但以链表存储的list和slist不是random access container;);
2.  Sequence(线性容器)(@1 Sequence:是一种大小可变的container,其元素系以strict linear order加以排列,sequence concept导入许多新的member functions,用以安插或删除任意位置或区间内的元素,STL实例包括vector、deque、list和slist等;
          @2 Front insert sequence:是一种sequence,可以在amortized constant time内将元素安插于起始点或是取得起始位置的元素,可以有.front、push_front和pop_front操作。STL中的Front insert sequence有list、slist、deque等,vector不是,因为无法push_front和pop_front;
          @3 Back insert sequence:是一种sequence,可以在amortized constant time内将元素安插于尾端或是取出最后元素,可以有.back、push_back和pop_back操作。STL中的Back insert sequence有list、vector、deque等,slist不是,因为它是单向连接链表;);
3.  Associative containers(关联容器)(@1 Associative container:是一种大小可变的container,支持以key(键值)为基础,有效率地取出元素的方法,它也提供安插与移除操作,但与sequence不同的是,它不支持将元素安插到特定位置。有simple associative container和pair associative container,有unique associative container和multiple associative container,有效表达式包括.find()、.count()、.equal_range()和.erase()等操作,STL实例包括set、multiset、hash_set、hash_multiset、map、multimap、hash_map和hash_multimap等;
          @2 Unique associative container:是一种associative container,具有container中每一个key都独一无二的性质,unique associative container中没有两个元素有相同的key,有效操作.insert()。STL中的Unique associative containers有set、map、hash_set和hash_map等;
          @3 Multiple associative container:是一种associative container,可内含具有相同键值(key)的元素,有效操作.insert()。STL中的multiple associative container有multiset、multimap、hash_multiset和hash_multimap等;
          @4 Simple associative container:是一种associative container,其元素本身就是key。STL中的simple associative container有set、multiset、hash_se和hash_multiset等;
          @5 Pair associative container:是一种associative container,将key与某些objects产生关联,其value_type为pair<const key_type,mapped_type>,其中key_type为container的key_type。STL中的pair associative container有map、multimap、hash_map和hash_multimap等;
          @6 Sorted associative container:是一种associative container,针对key做strict weak ordering递增排序,来排列各元素,有效操作.key_comp()、.value_comp()、.lower_bound()、.upper_bound()、.equal_range()和.insert()。STL中的sorted associative container有map、set、multimap和multiset等;
          @6 Hashed associative container:是一种associative container,以hash table(散列表)实现完成,hashed associative container并不做排序动作,对于单纯地存取值而次序不重要得应用而言hasn associative container比sorted associative container更快,有效操作.hash_funct()、.key_eq()、.bucket_count()、.resize()。STL中的hash associative container有hash_sethash_map等;);
4.  Allocator(空间配置器)(allocator是一个class,用来封装内存分配与归还的某些细节,有效操作.allocate()、.deallocate()、.max_size()、.construct()、.destroy()和.address()。STL预定义的只有allocator;);

泛型与STL Note相关推荐

  1. 泛型算法STL中的迭代器,泛型算法,萃取机的一个实现案例

    迭代器介绍: 迭代器其实是一个类,但是因为重载了* ++等指针操作的符号,所以有着和指针类似的共能,对于一个自己写的类,如果想使用迭代器这种功能就得自己写了,STL的标准容器都有迭代器,迭代器作用于, ...

  2. 【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)

    C++ 泛型编程 中的泛型算法和STL(sort,find,find) 1. 引言 1.1 简述泛型编程和STL的重要性 1.2 介绍泛型算法的基本概念 2. STL中的泛型算法 2.1 定义及主要特 ...

  3. 重新学习c++--理解引用、智能指针、虚函数、模板、容器

    最近几年用c和python比较多,上次用c++写程序已经是几年前的事情了.温故而知新,是时候重新学习下c++了. C++可以分成四大块去理解: C c++仍以C为基础,区块blocks.语句state ...

  4. unity 和安卓互相交互

    https://blog.csdn.net/u010407393/article/details/79423769 Unity和安卓交互 一:设置环境 1.安装Android Build Suppor ...

  5. FAQ翻译 第一章 C++蓝图

    原文章地址: https://isocpp.org/wiki/faq/big-picture 什么是C++? c++是一门通用语言, 偏向于系统编程, 是更好的C语言, 支持数据抽象(类...), 支 ...

  6. C++学到什么程度可以面试工作?

    链接:https://www.zhihu.com/question/400543720 编辑:深度学习与计算机视觉 声明:仅做学术分享,侵删 至少需要哪些知识?需要掌握到什么程度呢? 作者:inval ...

  7. Part10 泛型程序设计与C++标准模板库 10.1泛型程序设计及STL的结构

    1泛型程序设计的基本概念 泛型程序设计: 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数 ...

  8. 结合泛型与模板的STL.NET

    开始之前,先来看一个笑话,当问一个C++程序员怎样完成一个给定的任务时,他(她)可能会提供一打或更多的潜在解决方案列表,但又会极其详细地标出每种方案的问题之处,让你不知所措,难以选择.而Visual ...

  9. C++Builder STL 泛型

    STL(Standard Template Library)标准模板库, 包括了算法,容器,迭代器.就是泛型. 向量(vector) 连续存储的元素<vector> 列表(list) 由节 ...

  10. (P72)stl(一):泛型程序设计,什么是STL,STL六大组件及其关系

    文章目录 1.泛型程序设计 2.什么是STL 3.STL六大组件及其关系 1.泛型程序设计 泛型编程(generic programming) 类属编程 将程序写得尽可能通用 将算法从数据结构中抽象出 ...

最新文章

  1. 颠覆认知:SRE 到底是干啥的?
  2. 听说你想去大厂看学姐,带你看看京东软件产品经理岗长啥样?
  3. 【实战高保真】电商saas全套原型、店铺管理、店铺装修、商品管理、会员管理、维权管理、会员管理、营销管理、财务管理、渠道管理、saas系统、Axure高保真后台管理原型、rp源文件、axure原型
  4. java对象地址连续_Java面向对象中地址的理解(长期修改)
  5. python colorbar刻度_matplotlib画3D图修改X,Y,Z,colorbar的刻度值
  6. 博途wincc 与 sql 连接操作(博途V14 wincc advanced)
  7. Arcgis 安装教程
  8. DAX计算月末一次加权平均出库金额
  9. Java图形用户界面
  10. 图神经网络在知识图谱中的应用
  11. TypeScript配置、tsconfig.json配置文件,TypeScript使用详解
  12. 【SSL_2020.10.27】小biu闯关
  13. 设置redis key的expire过期时间
  14. 微信6.6.7版本摇塞子破解思路(居多图)
  15. manjaro 安装的艰辛历程,常用软件安装以及踩坑
  16. 量子计算与量子软件(一)
  17. 运行易语言必须放在c盘才能打开,易语言怎样写隐藏运行图片里的文件
  18. 完美解决Idea unable to access git 错误
  19. 淘宝客运营推广技巧方法有哪些?
  20. 全选、全不选、反选功能的实现

热门文章

  1. JDK7下载|JDK1.7下载可选择window版和linux版
  2. 透镜成像原理,眼球成像原理,小孔成像原理
  3. 如何用MEGA-X构建进化树
  4. usb万能驱动win7_给 win7 系统镜像添加驱动
  5. 2013年中国新媒体行业的八大趋势
  6. 方法解读 | 性染色体Phasing
  7. 三插头内部结构图_两脚插头和三脚插头区别是什么 插座的结构特点有哪些
  8. LX4056耐高压线性锂电池充电IC(耐压30V,带OVP,带NTC)
  9. git commit 参数详解 --amend
  10. 为什么使用Python保存的视频特别大!!(数据速率/总比特率)