提纲
o1. 概论
o2. 模板机制的介绍
o3. STL中的基本概念
o4. 容器概述
o5. 迭代器
o6. 算法简介
概论
C++
语言的核心优势之一就是便于软件的重用
C++
中有两个方面体现重用:
1.
面向对象的思想:继承和多态,标准类库
2.
泛型程序设计
(generic programming)
的思想:模板机制,以及标准模板库
STL
泛型程序设计
o
泛型程序设计,简单地说就是
使用模板的程序设计
法。
n
将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法。
o
标准模板库
(Standard Template Library)
就是一些常用数据结构和算法的模板的集合。主要由
Alex
Stepanov
开发,于
1998
年被添加进
C++
标准
o
有了
STL
,不必再从头开始编写繁多的标准数据结构和算法,并且一样可获得非常高的性能。
模板引子
1.假如设计一个求两参数最大值的函数,在实践中我们可能需要定义四个函数:
int max(int a,int b){return(a>b)?a,b; }
long max ( long a , long b ) { return ( a > b ) ? a , b ;}
double max ( double a , double b ) { return ( a >b)? a , b ; }
char max ( char a , char b ) { return ( a > b ) ? a , b ;}
2.这些函数几乎相同,唯一的区别就是形参类型不同
3.需要事先知道有哪些类型会使用这些函数,对于未知类型这些函数不起作用
模板的概念
1.
所谓模板是一种使用无类型参数来产生一系列
函数
或
类
的机制。
2.
若一个程序的功能是对某种特定的数据类型进行处理,则可以将所处理的数据类型说明为参数,以便在其他数据类型的情况下使用,这就是
模板的由来
。
3.
模板是以一种完全通用的方法来设计函数或类而
不必预先说明
将被使用的每个对象的类型。
4.
通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从而
避免
需要为每一种数据类型产生一个单独的类或函数。
模板分类
o
函数模板
(function template)
n
是独立于类型的函数
n
可产生函数的特定版本
o
类模板
(class template)
n
跟类相关的模板,如
vector
n
可产生类对特定类型的版本,如
vector<
int
>
求最大值模板函数实现
1.求两个数最大值,使用模板
template < class T >
T max(T a , T b){
return ( a > b ) ? a , b;
}
2.template < 模板形参表>
<返回值类型> <函数名>(模板函数形参表)
{
//函数定义体
}
模板工作方式
o
函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行
o
在说明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的形参,然后生成一个重载函数。该重载函数的定义体与函数模板的函数定义体相同,它称之为
模板函数
模板优缺点
o
函数模板方法克服了
C
语言解决上述问题时用大量不同函数名表示相似功能的坏习惯
o
克服了宏定义不能进行参数类型检查的弊端
o
克服了
C++
函数重载用相同函数名字重写几个函数的繁琐
o
缺点,调试比较困难
n
一般先写一个特殊版本的函数
n
运行正确后,改成模板函数
STL
中的几个基本概念
o
容器:可容纳各种数据类型的多元素数据结构。
o
迭代器:可
依次存取
容器中元素的
东西
(
指针?下标
?)
o
算法:用来操作容器中的元素的
函数模板
。例如,
STL
用
sort()
来对一个
vector
中的数据进行排序,用
find()
来搜索一个
list
中的对象。
n
函数本身与他们操作的数据的结构和类型无关
,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。
o
比如,数组
int
array[100]
就是个容器,而
int
*
类型的指针变量就可以作为迭代器,可以为这个容器编写一个排序的算法
容器概述
o
可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构。
o
容器分为三大类:
1) 顺序容器
vector:后部插入/删除,直接访问
deque:前/后部插入/删除,直接访问
list:双向链表,任意位置插入/删除
2)关联容器
set:快速查找,无重复元素
multiset:快速查找,可有重复元素
map:一对一映射,无重复元素,基于关键字查找
multimap:一对一映射,可有重复元素,基于关键字查找
前2者合称为第一类容器
3)容器适配器
stack:LIFO
queue:FIFO
priority_queue:优先级高的元素先出
未完待续...........................