类模板

C++ 模板

眉间皱痕 提交于 2020-02-03 19:56:13
泛型程序设计与模板: 一种算法在实现时不指定具体要操作的数据的类型的程序设计方法。所谓"泛型"是指算法只要实现 一遍,就能适用于多种数据类型。泛型程序设计方法的好处在于能够减少重复代码的编写。 在C++中模板分为函数模板和类模板两种。 函数模板: 作用:面向对象的继承和多态机制有效的提高了程序的可重用性和可扩充性,但在可重用性的 某些方面,程序员还希望得到更多的支持,以减少重复代码的编写。 // 例如:Swap函数 void Swap(int &a, int &b){ int c = a; a = b; b = c; } void Swap(double &a, double &b){ double c = a; a = b; b = c; } template <typename T> void Swap(T &a, T &b){ T c = a; a = b; b = c; } 在编写Swap函数时,在面对不同的数据类型,我们需要编写不同的重载函数,但这些函数初处了所处理的 数据类型的不同,形式上是一模一样的,为了减少这些重复代码的编写,继承和多态明显无法解决这些问 题。因此,"模板"的概念就应运而生。 函数模板的写法: template <typename 类型参数1,类型参数2,...> 返回值类型 模板名(形参表){ 函数体; }

C++ 缺少 类模板 的参数列表

笑着哭i 提交于 2020-02-03 00:57:47
@C++ 缺少 类模板 的参数列表 编写代码的时候,编译器提示缺少std::list参数列表,该怎么办。我是VS的工具。 # include <iostream> # include <vector> # include <list> using namespace std ; using namespace std :: list ; vector < int > twoSum ( vector < int > & nums , int target ) { // 备份原数组 vector < int > tmp ; for ( int i = 0 ; i < nums . size ( ) ; i ++ ) tmp . push_back ( nums [ i ] ) ; // 对原数组进行排序 std :: list :: sort ( nums . begin ( ) , nums . end ( ) ) ; vector < int > res ; // 头尾双向遍历 int st = 0 ; int en = nums . size ( ) - 1 ; while ( st < en ) { while ( nums [ en ] + nums [ st ] > target && en > st ) en -- ; if ( en == st ) break ; if

类模板与模板类详解

拈花ヽ惹草 提交于 2020-01-23 19:17:50
在C++的Template中很多地方都用到了typename与class这两个关键字,有时候这两者可以替换,那么这两个关键字是否完全一样呢?   事实上class用于定义类,在模板引入c++后,最初定义模板的方法为:template<class T>,这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候可以使用下面的方式了:   template<typename T>.在模板定义语法中关键字class与typename的作用完全一样 区分类模板与模板类的概念   一个类模板(类生成类)允许用户为类定义个一种模式,使得类中的某些数据成员、默认成员函数的参数,某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。   如果一个类中的数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表一类类。   类模板定义: 定义一个类模板,一般有两方面的内容: A。首先要定义一个类,其格式为: template<class T> class test { .... } test为类名,在类定义体中,如果采用通用数据类型的成员

C++函数模板和类模板 2017.11.09

白昼怎懂夜的黑 提交于 2020-01-23 19:16:20
1. 函数模板 函数模板声明: template <typename T>  template是模板关键字,typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符。以下的数据类型可以用后面的标识符代替。 函数模板的声明和定义中间不能有其他语句,否则会报错。 函数模板定义及调用 void swap_(T &a, T &b) { T c; c = a; a = b; b = c; } int main() { int a = 10; int b = 20; swap_(a, b); char c1 = 'a'; char c2 = 'b'; swap_(c1, c2); cout << a << " " << b << endl; cout << c1 << " " << c2 << endl; system("pause"); } 主函数调用时传递形参的类型int char会替代T,调用时可以显示的调用,即swap_<int>(a,b); 函数模板和普通函数   两者的区别: 普通函数能够进行自动类型转换,而函数模板不允许进行自动类型转换!         (这条在程序中目前还没有成功实现)   函数模板和普通函数相同时的调用机制 函数模板也可以重载(返回值类型不是函数重载的标准) 优先选择普通函数,若一定要调用模板函数,在调用时加<

Pair类模板

好久不见. 提交于 2020-01-23 10:51:54
>Pair的实现是一个结构体而不是一个类< 1、标准头文件 #include<utility> 似乎无需引入该文件,在std命名空间内也有pair类型 2、格式为:template <class T1, class T2> struct pair; 在现实情况中我们可以像类似于STL创建新容器一样创建pair也可以直接使用,如下: 1 pair<int,int> p; 2 pair<int,int> p(10,20); 或者是: 1 map<char,int> m; 2 m.insert(pair<char,int>('a',10)); 3、访问方式 对与pair中的两个元素,我们可以使用first和second来进行访问,顾名思义first返回第一个元素,而second返回第二个元素,如: 1 pair<int,int> p(10,20); 2 cout<<p.first<<" "<<p.second<<endl; 4、make_pair: 函数原型template pair make_pair(T1 a, T2 b) { return pair(a, b); } 我们可以通过make_pair生成我们的所需要的pair,对于一般的pair而言,我们如果需要对其进行赋值,则需要: 1 pair<int,int> p; 2 p.first=10,p.second=20;

C++ template

爷,独闯天下 提交于 2020-01-21 03:45:27
转自 http://www.cnblogs.com/assemble8086/archive/2011/10/02/2198308.html 一、类模板定义及实例化 1. 定义一个类模板: 1 template<class 模板参数表> 2 3 class 类名{ 4 5 // 类定义...... 6 7 }; 其中,template 是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是 类型参数 ,也可以是 非类型参数。 类型参数由关键字class或typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义中的一个常量。 例: 1 template<class type,int width> 2 3 //type为类型参数,width为非类型参数 4 5 class Graphics; 注意: (1) 如果在全局域中声明了与模板参数同名的变量,则该变量被隐藏掉。 (2) 模板参数名不能被当作类模板定义中类成员的名字。 (3) 同一个模板参数名在模板参数表中只能出现一次。 (4) 在不同的类模板或声明中,模板参数名可以被重复使用。 1 typedef string type; 2 3 template<class type,int width> 4 5 class Graphics 6 7 { 8 9 type node;/

VS2010类模板更改,增加版权等等信息

邮差的信 提交于 2020-01-20 18:23:46
在开发过程中往往需要在每一个页面(类)增加注释等等内容,VS2010中可以修改模板,在原有模板中增加一个类,会引用System等等命名空间,以及一些程序集。下面我们来看看如何增加自己需要一些说明,比如开发者等等。其实很简单只要修改安装目录下的Class.zip里面的Class.cs文件内容,然后重新注册一下就可以了。注意,在运行注册命令的时候需要关闭所有打开的VS2010开发工具,否则可能会有意想不到的效果。 1.打开安装目录下的ItemTemplates目录,比如: C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates 里面有好几个目录,找到相应的.zip文件打开修改后保存即可。由于我们要修改类的信息,所以打开如下目录: C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\Code\2052 看到下面有Class.zip了吧,解压打开Class.cs文件,并修改代码如下所示: /* ******************************************************** * 开发人员:小兵 * 创建时间:$time$ * 描述说明: * * 更改历史: * * *

VS2010类模板更改,增加版权等等信息

醉酒当歌 提交于 2020-01-20 18:22:37
VS2010类模板更改,增加版权等等信息 在开发过程中往往需要在每一个页面(类)增加注释等等内容,VS2010中可以修改模板,在原有模板中增加一个类,会引用System等等命名空间,以及一些程序集。下面我们来看看如何增加自己需要一些说明,比如开发者等等。其实很简单只要修改安装目录下的Class.zip里面的Class.cs文件内容,然后重新注册一下就可以了。注意,在运行注册命令的时候需要关闭所有打开的VS2010开发工具,否则可能会有意想不到的效果。 1.打开安装目录下的ItemTemplates目录,比如: C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates 里面有好几个目录,找到相应的.zip文件打开修改后保存即可。由于我们要修改类的信息,所以打开如下目录: C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\ItemTemplates\CSharp\Code\2052 看到下面有Class.zip了吧,解压打开Class.cs文件,并修改代码如下所示: /* ******************************************************** * 开发人员:小兵 * 创建时间:$time$ *

C++中类模板的概念和意义

核能气质少年 提交于 2020-01-14 07:02:56
1,在 C++ 中是否能够将泛型的思想应用于类? 1,函数模板是将泛型编程的思想应用于函数,就有了函数模板; 2,可以,常用的 C++ 标准库就是 C++ 中的标准模板库,C++ 中的 STL 就是将泛型的思想应用于一系列的函数,就得到了函数模板,当然也有很多的类模板; 3,类模板就是将泛型思想应用于 C++ 中的类而得到的新概念; 2,类模板: 1,一些类主要用于存储和组织数据元素; 1,类模板就是为了数据结构而诞生的; 2,类中数据组织的方式和数据元素的 具体类型无关; 3,如:数组类、链表类、Stack 类、Queue 类等; 1,C++ 中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需实现的功能; 3,C++ 中的类模板: 1,以相同的方式处理不同的类型; 2,在类声明前使用 template 进行标识; 3,< typename T > 用于说明类中使用的泛指类型 T; 1,代码示例: 1 template < typename T > 2 class Operator // class 表明将泛型编程应用于类 3 { 4 public: 5 T op(T a, T b) // T 在使用类模板定义具体对象的时候关心,其它时候不关心; 6 }; 4,类模板的应用: 1,只能显示指定具体类型,无法自动推导; 2,使用具体类型 < Type >

模板

◇◆丶佛笑我妖孽 提交于 2020-01-04 23:57:21
在我们编写代码时,我们会遇见这种情况: 比如交换函数,当我们要交换的类型是int(传的参数为int型)时,我们要编写的swap函数的形参就应该是int,但当我们要交换的是double型时,我们还要再写一个swap函数来满足要求。每换一种类型就要再重载一个swap函数来满足条件。 虽然通过这方法重载实现所有类型的交换函数,但是这种方法有几个不好的地方,一是重载函数仅仅类型不同,导致代码的复用率很低,只要有新类型出现,就要增加对应的函数;再者代码的可维护性比较低,一个出错可能所有的重载都出错,要一个一个改。 通过上面的例子,我们想能不能告诉编译器一个模子,编译器可以通过不同的类型利用这样的模子自动生成适合各种类型的函数。答案是当然可以 即泛型编程:编写与类型无关的通用代码,而模板是泛型编程的基础。 下面我们来郑重的引入 模板 模板分为函数模板和类模板 函数模板: 什么是函数模板? 函数模板是一个与类型无关,并且对所有类型都适用的函数,在使用时函数可被参数化,根据实参类型结合模板产生函数的特定类型版本实现函数功能。 如何使用? template <typename T1,typename T2...> 返回值 函数名(参数列表){ } typename是用来定义模板参数关键字的,也可以用class 例如: template<typename T> void Swap(T &x, T &y