有效地利用已有的成果,将经典的.优秀的算法标准化.模块化,从而提高软件的生产率,是软件产业化的需求,为了实现这一需求,不仅需要面向对象设计思想,而且需要泛型程序设计思想. c++语言提供的标准模板库(standard template library,STL)便是对象对象程序设计和泛型程序设计(Generic Programming)思想相结合的一个良好典范. 1.泛型程序设计的概念和术语 1)泛型程序设计 泛型程序设计就是要将程序写得尽可能通用,同时并不损失效率.它的首要目标是标准容器,进而是…
标准c++算法是通过迭代器和模板来实现的,其实算法本身就是一种函数模板. 算法从迭代器那里获得一个元素,而迭代器则知道一个元素在容器中的什么位置.迭代器查找元素的位置并将这些信息提供给算法以便算法能够访问这些元素.算法不必关心具体的元素存储在容器中什么位置的细节,通常情况下,算法也不必直到存储元素的容器的种类.算法只需要简单地申请一个元素就可以了,根本无须直到这个元素是什么或者这个元素可能存储在什么地方.这样的话一个标准的算法就可以处理几乎所有类型的容器,并且一个容器可以容纳几乎任何类型的元素.…
顺序容器类以逻辑线性排列方式存储元素,在这些容器类型中的元素在逻辑上被认为是连续的存储空间中存储的.顺序容器可用于存储线性群体. 在关联容器类中,元素的存储和检索基于关键字和元素与其他元素之间的关系,与顺序容器类的元素存储和检索方式完全不同. 对顺序容器的访问分为顺序或直接(也称随机)两种. 容器类库中向量和队列提供直接访问,而列表提供连续访问. 还有4种类型的关联容器:集合容器.多重集合容器.映射容器和多重映射容器.关联容器具有从基于链的集合中快速提取对象的能力.集合的大小可在运行时改变. 在…
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如:int型是Comparable概念的模型: 静态数据类型不是Assignable概念的模型(无法用“=”给整个静态数组赋值) 用概念做模板参数名 很多STL的实现代码都是使用概念来命名模板参数的 为概念赋予一个名称,并使用这个名称作为模板参数名 表示insertionSort这样的一个函数模板的原型…
容器适配器是用来扩展7中基本容器的,是修改和调整其他类接口的类.他们不提供存放数据的实际数据结构的实现方法,而且容器适配器也不支持迭代器. 1.标准栈容器 使用STL中的标准栈为程序员提供了一层附加的保护,下溢和上溢的情况在发生之间就会被捕获. 标准栈容器是使用适配器与一种基础容器相结合来实现的.使用适配器类,必须要包含他们的头文件,栈是<stack>中声明的.适配器在声明时必须传递参数,指明栈元素的类型及适配器将与那种基础容器向结合. 容器适配器的参数是某种顺序容器. 例如: stack&l…
1.函数对象 函数对象是STL提供的第四类主要组件,它使得STL的应用更加灵活方便,从而增强了算法的通用性.大多数STL算法可以用一个函数对象作为参数.所谓“函数对象”其实就是一个行为类似函数的对象,它可以不需要参数,也可以带有若干参数,其功能是获取一个值,或者改变操作的状态. 在c++程序设计中,任何普通的函数和任何重载了调用运算符operator()的类的对象都满足函数对象的特征,因此都可以作为函数对象传递给算法作为参数使用. 以数值算法accumulate()为例子,介绍函数对象的设计及应…
理解迭代器对于理解STL框架并掌握STL的使用至关重要.简单地说,迭代器是面向对象版本的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器和序列中每个元素的方法. 虽然指针也是一种迭代器,但迭代器却不仅仅是指针.指针可以指向内存中的一个地址,通过这个地址就可以访问相应的地址.而迭代器更为抽象,它可以指向容器中的一个位置,我们也许不必关心这个位置的真正物理地址,但是我们可以通过迭代器访问这个位置的元素. 迭代器是算法和容器的“中间人”,遍历链表需要指针,对数组元素进行…
双端队列容器是一种放松了访问权限的队列.除了从队列的首部和尾部访问元素外,标准的双端队列也支持通过使用下标操作符"[]"进行直接访问. 它提供了直接访问和顺序访问方法.其头文件为<deque>. 1)双端队列容器的构造函数 有4中形式的构造函数: deque();//构造size()为0的双端队列容器 deque(size_type n,const T& v=T());//初始化大小为n的双端队列,第二个参数是每个元素的初始值,默认为T()构造的对象 deque(c…
向量容器属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问).这一点与c++语言支持的基本数组类型相同,但基本数据类型不是面向对象的.而面向对象的向量是动态结构,他的大小不固定,可以在程序运行时增加或减少. 向量容器可以用来实现队列.栈.列表和其他更加复杂的结构,事实上,向量容器可以用来实习那其他所有容器.使用向量容器之前必须包含头文件vector. 1.向量容器的构造和析构函数 容器类库中的向量容器包含有4中构造函数: vectot();//默认构造函数…