有效地利用已有的成果,将经典的、优秀的算法标准化、模块化,从而提高软件的生产率,是软件产业化的需求,为了实现这一需求,不仅需要面向对象设计思想,而且需要泛型程序设计思想。

c++语言提供的标准模板库(standard template library,STL)便是对象对象程序设计和泛型程序设计(Generic Programming)思想相结合的一个良好典范。

1、泛型程序设计的概念和术语

1)泛型程序设计

泛型程序设计就是要将程序写得尽可能通用,同时并不损失效率。它的首要目标是标准容器,进而是标准算法,总的目标是最通用、最有效最灵活地表现概念。

标准c++类库包含的组建即支持面向对象的设计与编程,又支持泛型程序设计。标准组件对来年各种设计方法的支持赋予了c++类库复合或双重特性。c++的模板为泛型程序设计奠定了关键的基础,它是所有版本STL的基石。

泛型程序设计的主要思想是,将算法从特定的数据结构中抽象出来,使算法成为通用的,可以作用于各种不同的数据结构。这种以函数模板形式实现的通用算法与各种通用容器结合,极大地提高了软件的复用性。

在STL中充当苏纳法与容器之间媒介的,便是迭代器(iterator)。

如果从应用角度来看,构建STL的架构最关键的4个组件是容器、迭代器、算法和函数对象。算法处于核心地位,迭代器如同算法和容器类之间的桥梁,算法通过迭代器从容器中获取元素,然后将获取的元素传递给特定的函数对象进行的操作,最后将处理后的结果存储到容器中。

2)命名空间的概念

一个命名空间将不同标识符集合在一个命名作用域内。为了说明标识符属于哪一个命名空间的,需要在标识符前面加上命名空间名字和“::”,例如,如下形式声明一个命名空间NS,并在其中声明若干标识符:

namespace NS{

class File;

void Fun();

}

则引用标识符的方式如下:

NS::File obj;

NS::Fun();

除了这样声明的命名空间外,还有一个无名的命名空间,无需特殊声明。在声明标识符时并未指定命名空间,这些标识符便属于无名的命名空间。

为了避免总是在标识符前面写很长的前缀,可以用using来指定命名空间。如经过以下声明

using NS::File;

在当前作用域中就可以直接引用标识符File,也就是说File与NS::File等效。

如果使用声明Using namespace NS;NS命名空间中的所有标识符在当前作用域中都可以直接使用,无需任何前缀。但这样的命名冲突问题又来了。。。

在c++标准程序中,使用了命名空间std,在使用c++标准程序库的任何标识符时,可以直接指定标识符所属的命名空间。如std::out,也可以使用using来打开命名空间的限制。

3)头文件命名规则

在新的c++标准程序库中,所有标识符都声明在命名空间std中,而且头文件都不使用扩展名,(#include<iostream>与#Include<iostream.h>等价)

为了使用STL中的组件,必须使用#Include命令以包含一个或多个头文件:

1)向量容器、列表容器和双端队列容器类分别位于<vector>、<list>、和<deque>中。

2)集合容器和多重集合容器位于<set>中,而映射容器map和多重映射容器multimap位于<map>。

3)stack适配器位于<stack>中,而queue和priority_queue适配器位于<queue>中。

4)算法位于<algorithm>中,通用数值算法位于<numeric>中。

5)迭代器类和迭代器适配器位于<iterator>中。

6)函数对象类和函数适配器位于<functional>中。

4)标准模板库相关概念和术语

1、容器

容器类是容纳、包含一组元素或元素集合的对象。容器类中包含一组元素或一个元素集合,作为通用元素收集器。c++语言的容器类中可以包含混合类型的元素,即容器类可以包含一组不同类型的元素或一组相同类型的元素。当容器类包含不同类型的元素时,称为异类容器类;当容器类包含相同类型的元素时,称为同类容器类。

容器类库中包括7种基本容器:向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)等。这7种容器可以分为2中基本类型:顺序容器和关联容器。

顺序容器将一组具有相同类型的元素以严格的线性形式组织起来,向量、双端队列和列表容器就属于这一种。关联容器具有根据一组索引来快速提取元素的能力,集合和映射容器就属于这一种。

2、适配器

适配器是一种接口类,为已有的类提供新的接口。适配器修改或调整其他类的接口,目前是简化、约束、使之安全、隐藏或者改变被修改类提供的服务集合。

当某个类使用的唯一目的就是改变其他类的接口形式时,它就是一个适配器或一个接口类。

c++标准模板库提供了3种类型的适配器:容器适配器、迭代器适配器和函数对象适配器。其中容器适配器来扩展7种基本容器,他们和顺序容器相结合构成栈、队列和优先队列容器,提供了栈、队列和优先队列的功能。

3、迭代器

迭代器是面向对象版本的指针,他们提供了访问容器和序列中每个元素的方法。实际上指针也是一种迭代器。很多容器和序列提供了类似于current()的成员函数,返回迭代其所指向的元素的地址或引用。类似于指针,迭代器可以调用next()和previous()等成员函数顺序遍历容器。

4、算法

c++标准模板库中包括70多个算法,这些算法覆盖了相当大的应用领域。其中包括查找算法、排序算法、消除算法、记数算法、比较算法、变换算法、置换算法和容器管理等等,这些算法的一个最重要的特性就是他们的统一性,并且可以广泛应用于不同的对象和内置的数据类型。

5、容器的接口

在有效使用容器之前,理解容器类的接口是非常重要的。所谓的“接口”是指容器的方法(函数)和运算符。

每个容器包括一个或多个公有的构造、拷贝构造、析构函数。除此之外,所有的容器都支持一个运算符集合,这些运算符完成字典式的比较。

所有标准容器定义的运算符

通用容器运算符                                                                                                说明

a==b                                                                                                  同类容器的等于操作

a!=b                                                                                           同类容器的不等于操作,和!(a==b)等价

a>b                                                   如果b<a,返回布尔型true

a>=b                                                                                        如果!(a<b),返回布尔型true

a<b                                                                                         如果a<b,返回布尔型true

a<=b                                                                                      如果!(b<a),返回布尔型true

r=a                                      容器的赋值操作,需要有r==a

注:假设有一容器类x,这里a和b是x的实例,r是类型x&的值。

所有的容器至少有4中迭代方法和4种访问方法,4种迭代方法用来访问容器中的元素,4种访问方法用来访问容器信息。

每种容器定义的迭代和访问方法

迭代方法                                                                    说明

begin()                  返回一个指向容器的第一个元素的迭代器(iterator)

end()                   返回一个指向容器末尾值的迭代器

rbegin()                  返回reverse_iterator(end()),一个逆向迭代器,指向反序后的首元素

rend()                   返回reverse_iterator *(begin()),一个逆向迭代器,指向反序后的尾元素。

访问方法                       说明

size()                    返回容器的元素数

max_size()                 返回容器可以容纳的最大元素数

swap()                   交换两个相同类型的容器

empty()                  如果容器为空或者size()=0,则返回真(true)。

8、泛型程序设计与c++标准模板库1、泛型程序设计的概念和术语的更多相关文章

  1. 8、泛型程序设计与c++标准模板库4.标准c++库中的算法

    标准c++算法是通过迭代器和模板来实现的,其实算法本身就是一种函数模板. 算法从迭代器那里获得一个元素,而迭代器则知道一个元素在容器中的什么位置.迭代器查找元素的位置并将这些信息提供给算法以便算法能够 ...

  2. 8、泛型程序设计与c++标准模板库2、c++标准模板库中的容器

    顺序容器类以逻辑线性排列方式存储元素,在这些容器类型中的元素在逻辑上被认为是连续的存储空间中存储的.顺序容器可用于存储线性群体. 在关联容器类中,元素的存储和检索基于关键字和元素与其他元素之间的关系, ...

  3. C++学习笔记53:泛型程序设计与C++标准模板库

    泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如: ...

  4. 8、泛型程序设计与c++标准模板库2.5容器适配器

    容器适配器是用来扩展7中基本容器的,是修改和调整其他类接口的类.他们不提供存放数据的实际数据结构的实现方法,而且容器适配器也不支持迭代器. 1.标准栈容器 使用STL中的标准栈为程序员提供了一层附加的 ...

  5. 8、泛型程序设计与c++标准模板库5.函数对象

    1.函数对象 函数对象是STL提供的第四类主要组件,它使得STL的应用更加灵活方便,从而增强了算法的通用性.大多数STL算法可以用一个函数对象作为参数.所谓“函数对象”其实就是一个行为类似函数的对象, ...

  6. 8、泛型程序设计与c++标准模板库3.迭代器

    理解迭代器对于理解STL框架并掌握STL的使用至关重要.简单地说,迭代器是面向对象版本的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器和序列中每个元素的方法. 虽然指 ...

  7. 8、泛型程序设计与c++标准模板库2.3双端队列容器

    双端队列容器是一种放松了访问权限的队列.除了从队列的首部和尾部访问元素外,标准的双端队列也支持通过使用下标操作符"[]"进行直接访问. 它提供了直接访问和顺序访问方法.其头文件为& ...

  8. 8、泛型程序设计与c++标准模板库2.2向量容器

    向量容器属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问).这一点与c++语言支持的基本数组类型相同,但基本数据类型不是面向对象的.而面向对象的向量是动态结构 ...

  9. 第十章 泛型程序设计与C++标准模板库 泛型程序设计及STL的结构

随机推荐

  1. 【leetcode刷题笔记】Anagrams

    Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...

  2. 处理 javax.el.ELException: Failed to parse the expression 报错

    在JSP的表达式语言中,使用了  <h3>是否新Session:${pageContext.session.new}</h3>  输出Session是否是新的,此时遇到了  j ...

  3. LINQ 学习路程 -- 查询操作 Distinct Except Intersect Union

    Set Operators Usage Distinct 去掉集合的重复项 Except 返回两个集合的不同,第一个集合的元素不能出现在第二个集合中 Intersect 返回两个集合的交集,即元素同时 ...

  4. android 真心话大冒险 摇色子

    android 真心话大冒险  摇色子 软件

  5. matlab之viscircles()函数

    函数功能:画圆 语法: viscircles(centers,radii) viscircles(ax,centers,radii) viscircles(___,Name,Value) h = vi ...

  6. form表单验证失败,阻止表单提交

    form表单验证失败,阻止表单提交 效果演示: 贴上完整代码: <!DOCTYPE html> <html lang="en"> <head> ...

  7. 仿联想商城laravel实战---4、验证(lavarel的表单验证如何使用)

    仿联想商城laravel实战---4.验证(lavarel的表单验证如何使用) 一.总结 一句话总结: 验证规则和验证信息的数组:在控制器的方法中 1.注册页面中的用户名正确(比如是否重名,字段长度是 ...

  8. deepmoji:文本预测emoji

    输入句子,预测emoji demo: https://deepmoji.mit.edu/ github: https://github.com/bfelbo/DeepMoji  能够被预测的emoji ...

  9. git branch detached from jb4.2.2_1.0.0-ga

    /*************************************************************************** * git branch detached f ...

  10. pthread_detach()函数

    创建一个线程默认的状态是joinable. 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码). 所以创建线程者应该调 ...