- 浏览: 139534 次
- 性别:
文章分类
最新评论
泛型的基本思想:
泛型编程(Generic Programming)是一种语言机制,通过它可以实现一个标准的容器库。
像类一样,泛型也是一种抽象数据类型,但是泛型不属于面向对象,它是面向对象的补充和发展。
在面向对象编程中,当算法与数据类型有关时,面向对象在对算法的抽象描述方面存在一些缺陷。
比如对栈的描述:
class stack
{
push(参数类型) //入栈算法
pop(参数类型) //出栈算法
}
如果把上面的伪代码看作算法描述,没问题,因为算法与参数类型无关。但是如果把它写成可编译的源代码,
就必须指明是什么类型,否则是无法通过编译的。使用重载来解决这个问题,即对N种不同的参数类型写N个
push和pop算法,这样是很麻烦的,代码也无法通用。
若对上面的描述进行改造如下:
首先指定一种通用类型T,不具体指明是哪一种类型。
class stack<参数模板 T>
{
push(T) //入栈算法
pop(T) //出栈算法
}
这里的参数模板T相当于一个占位符,当我们实例化类stack时,T会被具体的数据类型替换掉。
若定义对象S为statc类型,在实例化S时若我们将T指定int型则:
这时候类S就成为:
class S
{
push(int) //入栈算法
pop(int) //出栈算法
}
这时我可以称class stack<参数模板 T>是类的类,通过它可以生成具体参数类型不同的类。
泛型在C++中的应用:
泛型在C++中的主要实现为模板函数和模板类。
通常使用普通的函数实现一个与数据类型有关的算法是很繁琐的,比如两个数的加法,要
考虑很多类型:
int add(int a,int b) { return a+b; }
float add(float a,float b) { return a+b; }
。。。。
虽然在C++中可以通过函数重载来解决这个问题,但是反复写相同算法的函数是比较辛苦的,
更重要的是函数重载是静态编译,运行时占用过多内存。
在此我们可以用C++的模板函数来表达通用型的函数,如下:
template<typename T> // 模板声明
T add(T a,T b) { return a+b; } // 注意形参和返回值的类型
这时C++编译器会根据add函数的参数类型来生成一个与之对应的带具体参数类型的函数并
调用。
例如:
#include <iostream>
using namespace std;
template <typename T>
T add(T a,T b) //注意形参和返回类型
{
return a+b;
}
void main()
{
int num1, num2, sum;
cin>>num1>>num2;
sum=add(num1,num2); //用int匹配模版参数T,若sum,num1,num2类型不一致则无法匹配。
cout<<sum;
}
函数模板的性质
1) 函数模板并不是真正的函数,它只是C++编译生成具体函数的一个模子。
2)函数模板本身并不生成函数,实际生成的函数是替换函数模板的那个函数,比如上例中的add(sum1,sum2),
这种替换是编译期就绑定的。
3)函数模板不是只编译一份满足多重需要,而是为每一种替换它的函数编译一份。
4) 函数模板不允许自动类型转换。
5) 函数模板不可以设置默认模板实参。比如template<typenameT=0>不可以。
C++模版函数的语法
template <typename模版参数列表…>
函数返回类型 函数名(形参列表…)
上面两行可以合并成一行。
例如:
下面的几种写法是等效的并且class和typename是可以互换的。
template <typenameT1, typename T2>
T1 fun(T1, T2, int )
{ //…..}
template <typenameT1,T2> T1 fun(T1, T2, int )
{ //…..}
template <classT1, class T2>
T1 fun(T1, T2, int )
{ //…..}
template <classT1,T2> T1 fun(T1, T2, int )
{ //…..}
C++模版类的语法
template <class模版参数列表…>
class 类名
{ //类体}
成员的实现…
例如:
//类声明部分,有两个模板参数T1,T2
template <classT1, class T2 >
class A {
private:
int a;
T1 b; //成员变量也可以用模板参数
public:
int fun1(T1 x, int y );
T2 fun2(T1 x, T2 y);
}
//类实现部分
template <classT1, class T2 >
int A<T1>:: fun1(T1 x, int y ){//实现…… }
template <classT1, class T2 >
T2 A<T1,T2>:: fun2(T1 x, T2 y) {//实现…… }
//使用类A
int main( ) {
//定义对象a,并用int替换T1, float替换T2
A<int, float> a;
//实例化a,调用a的属性和方法……
}
由上例可以看出, 类模板参数T1,T2对类的成员变量和成员函数均有效。
在C++编程中,当你要实现的一个类的某些成员函数和成员变量的算法
数据类型有关,可以考虑用类模板。C++版的数据结构算法大都用类模板实现。
类模板的性质
1)类模板不是真正的类,它只是C++编译器生成具体类的一个模子。
2)类模板可以设置默认模板实参。
C++ STL简介
STL(Standard Template Library,标准模板库)是C++对泛型编程思想的实现,最早是惠普实验室开发的。
在被引入C++之前该技术就已经存在了很长的一段时间。后来STL成为ANSI/ISO C++标准的一部分。各个
C++厂商也有各自相应的模板库,这些库效率可能很高,但可移植性不一定好。
STL广义上分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采
用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
在C++标准中,STL被组织为下面的13个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、
<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack> 和<utility>。
1) 算法(algorithm)
STL提供了大约100个实现算法的模版函数,算法部分主要由头文件<algorithm>,<numeric> 和<functional>组成。
<algorithm>是所有STL头文件中最大的一个,它是由一大堆模板函数组成的,其中常用到的功能范围涉及到比较、
交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
<numeric>体积很小,只包括一些简单数学运算的模板函数。
<functional>中则定义了一些模板类,用以声明函数对象。
2) 容器(container)(又称集合collection)
在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要
求很高的部分时,数据结构的选择就显得更加重要。
通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许指定容器中元素的数据类
型,可以将许多重复而乏味的工作简化。
如下表:
数据结构 |
|
实现头文件 |
向量(vector) |
顺序性容器 |
<vector> |
列表(list) |
顺序性容器 |
<list> |
双队列(deque) |
顺序性容器 |
<deque> |
集合(set) |
关联容器 |
<set> |
多重集合(multiset) |
关联容器 |
<set> |
栈(stack) |
容器适配器 |
<stack> |
队列(queue) |
容器适配器 |
<queue> |
优先队列(priority_queue) |
容器适配器 |
<queue> |
映射(map) |
关联容器 |
<map> |
多重映射(multimap) |
关联容器 |
<map> |
3)迭代器(iterator)
迭代器是一种允许程序员检查容器内元素,并实现元素遍历的数据类型。C++标准库为每一种标准容器定义了一种迭代器类型。迭代器类型提供了比下标操作更一般化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器(比如数组)支持下标操作。因为迭代器对所有的容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素。
迭代器从作用上来说是STL最基本的部分,迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。
迭代器部分主要由头文件<utility>,<iterator> 和<memory>组成。<utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,<iterator>中提供了迭代器使用的许多方法, <memory>为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。
发表评论
-
TC 3D模型绘图
2011-05-27 14:40 973/*这个程序用于描述一个用户给定方程的3D物体,用户可以通过键 ... -
C语言通过栈将十进制数转为八进制数
2011-07-07 19:00 1523//VC6.0下运行通过 #define STACK_INI ... -
C语言链队列的基本操作
2011-07-08 14:27 5257//链队列的初始化及入队出队操作,XP3+VC6.0 运行下通 ... -
VC2010 下安装OpenCV2.2
2011-07-14 15:18 1326VC2010 下安装OpenCV2.2成功 ... -
C++二分法查找算法
2011-07-29 10:35 1036/****************************** ... -
C语言 日期型转double型
2011-08-29 14:26 1035在C语言中没有直接将日期转换为double型的函数,但是 ... -
关于VC2010工程中的ipch文件夹和sdf文件
2012-05-14 15:59 1019VC2010中新建一个项目会同时建立一个特别占用磁盘空间 ... -
VC include文件名不区分大小
2012-05-17 10:36 1014VC include文件名不区分大小写,Linux下C/ ... -
指定VC2010中菜单ID时偶尔出现的大小写自动转换问题
2012-05-17 11:37 1016VC2010指定菜单ID时遇到的一个奇怪问题如下:ID_ ... -
VC2010 工具栏按钮添加事件
2012-05-21 10:08 2986VC2010 工具栏按钮添加事件的方法有如下两种: 1 ... -
在MFC 的CView中显示IplImage
2012-05-22 11:29 2596在MFC 的CView中显示IplImage如下: / ... -
VC2010 代码字体及颜色设置
2012-05-23 16:12 1479菜单: 工具->选项->环境->字体 ... -
VC2010 菜单项自动展开
2012-05-25 16:43 962在VC2010中若某个子菜单的菜单项过多会自动收缩起来, ... -
VC 实现菜单项及工具栏按钮同步禁用与启用
2012-05-29 09:25 3517也许太简单了,搜了N久,问了N多人,都没有找到解决异常的办 ... -
VC2010 MFC多文档项目中在带滚动条的窗口中显示图像
2012-06-01 19:17 3328首先创建MFC多文档项目XXX。 在XXXDoc.h中 ...
相关推荐
《C++泛型编程和设计模式应用》是Addison Wesley出版社推出的一本深入探讨C++编程技术的专业书籍,主要关注两个关键领域:泛型编程和设计模式。这本书旨在帮助开发者提高代码的重用性、灵活性和效率,通过利用C++...
### C++泛型编程:构建灵活的容器与图形类 #### 概述 在现代软件开发中,**泛型编程**是一种重要的编程范式,它允许程序员编写代码时使用未指定的数据类型,从而提高代码的复用性和灵活性。C++通过模板支持泛型...
C++泛型编程是C++语言中的一个重要特性,它允许开发者编写不依赖特定类型而具有通用性的代码。这种编程范式极大地提高了代码的重用性和灵活性,降低了维护成本。本篇将深入探讨C++泛型编程的应用实例,帮助初学者...
以下是对"各种排序算法的C++泛型实现"这个主题的详细解析。 1. **C++ 泛型编程**: C++中的模板是一种泛型编程工具,它允许我们创建函数或类,这些函数或类可以处理多种数据类型。在实现排序算法时,使用模板可以...
在《C++设计新思维》中,作者详细介绍了模板编程的概念,从基础的函数模板到复杂的类模板,再到模板特化和模板元编程,每一个环节都旨在帮助程序员构建起一个高效且通用的代码库。模板元编程尤其值得称道,它能够在...
### C++标准模板库STL和泛型编程简介 #### 一、STL概述 **STL**(Standard Template Library),即标准模板库,是C++标准库中的一个重要组成部分,它代表了C++语言的一项重大革新。STL的核心理念是将数据结构与算法...
基础概念 在C#中,`where`关键字用于指定泛型类型参数必须满足的条件。例如,在下面的代码示例中,我们定义了一个名为`MyGenericClass`的泛型类,并且为类型参数`T`指定了一个约束条件: ```csharp public class ...
内容概要:本文详细介绍了C++的模板与泛型编程,涵盖模板的基础概念、模板特化与偏特化、SFINAE及模板元编程等核心特性。模板功能使得C++不仅支持面向对象编程,还能实现泛型编程,极大地提高了代码的复用性和灵活性...
《泛型编程与STL》阐述了泛型编程的中心思想:concepts、modeling 、refinement,并为你展示这些思想如何导出STL的基础概念:iterators、 containers、function objects。...
内容概要:本文详细介绍了C++的基础知识点,涵盖面向对象编程(OOP)、内存管理、模板与泛型编程以及标准库(STL)等内容。首先讲解了C++的面向对象特性,包括封装、继承和多态。接着讨论了内存管理,涉及动态内存...
《C++设计新思维:泛型编程与设计模式之应用》这本书深入探讨了C++语言在泛型编程和设计模式中的应用,对于理解和提升C++编程能力有着重要的指导价值。以下将围绕这些主题展开详细讨论。 一、泛型编程 泛型编程是...
内容概要:本文详细介绍了C++模板和泛型编程的基础知识、进阶技术和实战应用。主要内容包括模板的概念与优势、函数模板和类模板的声明与实例化、模板元编程、SFINAE原则、模板特化与偏特化、类型推导与auto关键字、...
虽然C语言的实现不如C++ STL那样简洁和强大,但它可以帮助初学者理解数据结构和算法的基础,以及如何在没有模板支持的情况下实现泛型编程。 在提供的`List`压缩包文件中,可能包含了实现这些功能的源代码。对于初学...
这个压缩包“C++语言基础部分.zip”包含了C++入门所需的基本概念和语法,旨在帮助初学者建立稳固的编程基础。 C++起源于C语言,由Bjarne Stroustrup在1979年设计并实现,增加了类、模板、异常处理等面向对象特性。...
这份“C++笔试面试题基础”资料可能是为了帮助求职者准备C++相关的技术面试而设计的。下面将针对C++的基础知识进行详细阐述。 1. **C++简介**:C++是C语言的增强版,由Bjarne Stroustrup于1983年在贝尔实验室发起。...
6. **模板**:模板是C++中的一种泛型编程工具,允许创建泛型函数和泛型类,从而实现对不同类型的数据进行操作。 7. **STL(Standard Template Library)标准库**:STL是一组预先编写好的容器(如vector, list, set...
本教程集旨在帮助初学者理解和掌握C++的基础知识,并通过经典的面试题来检验和提升编程技能。 首先,"1-基本数据与表达式.pptx"涵盖了C++中的基本数据类型,包括整型(int)、浮点型(float、double)、字符型...
主要内容包括程序设计基础知识、类与对象的基本概念、继承与多态、输入输出流,以及泛型程序设计。此外,本教材还介绍了一些常用数据结构基础知识,使得读者学习本书后,能够解决一些简单的实际问题。整套教材语言...
1. **基础语法**:C++的基础包括变量、数据类型、运算符、流程控制(如if-else,switch-case,for,while,do-while循环)以及函数的使用。理解这些概念是编写任何程序的第一步。 2. **指针与内存管理**:C++的指针...