C++模板与STL库介绍
2013-10-11 21:13
239 查看
提纲
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:优先级高的元素先出
未完待续...........................
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:优先级高的元素先出
未完待续...........................
相关文章推荐
- c++头文件iomanip.h中的setw、setprecision、setfill和setbase函数
- C++面试若干问题
- 【一天一篇CPP】C++的虚基类
- 第一个C++程序
- 在c语言中用正则表达式实现对email地址和ip地址的验证
- C++ 友元
- c++基本寻址和变量声明,觉得挺好的就分享出来!
- C++ Boost
- c++功课:如何设计你的第一个程序
- C++实现计算程序运行时间 高精度
- 每天一小步——C语言中嵌入正则表达式
- 初看预处理的一些心得!c++知识点!
- c语言 判断文件结束问题 feof()
- C++ 操作符重载
- 【一天一篇CPP】多继承及其二义性(multiple inheritance,也叫多重继承,但不是多层继承)
- C++中class和struct的区别
- C语言 函数调用栈变化 (VC6.0)
- C++的RTTI基本原理
- [互联网面试笔试汇总C/C++-11] 字符串全排列和组合算法
- C/C++ I/O库函数