c++基础7:模板编程、泛型编程

文章目录1\. 什么是模板?2\. 模板有什么用?3\. 模板编程/泛型编程4\. 模板分类函数模板类模板概念技巧类模板模板原理1. 什么是模板?模板(Template)是允许函数或者类通过_泛型(generic types)_的形式表现或运行的特性。2. 模板有什么用?模板可以使函数或者类只写一份代码而对应不同的类型。3. 模板编程/泛型编程一种独立于特定类型的编码方式4. 模板分...
摘要由CSDN通过智能技术生成

1.模板基础知识

1.1. c++学习的四个阶段

a.c语言;
b.面向对象;
c.模板/泛型编程;
d.高级应用;

1.2 . 什么是模板?

模板(Template)是允许函数或者类通过_泛型(generic types)_的形式表现或运行的特性。
模板前的编程的数据必须要有数据类型;
模板则把类型作为变量;

1.3 . 模板有什么用?

模板可以使函数或者类只写一份代码而对应不同的类型。

1.4 模板编程/泛型编程

一种独立于特定类型的编码方式
(完整代码000_c_cmp.cpp)

(***)1.5 . 模板分类

模板分为函数模板与类模板两类。

  • 函数模板(Function template):使用泛型参数的函数(function with generic parameters)
  • 类模板(Class template):使用泛型参数的类(class with generic parameters)

(***)1.5.1函数模板

1.5.1.1 函数模板的目的

问题:多个类型实现相同的功能,多个函数,太过于繁琐;函数模板进行解决;
注意:注意:float类型的写法;(和double进行区分;)

cout << cmp(10.1F,13.2F) <<endl;  //(2)注意:float类型的写法;(和double进行区分;)
	cout << cmp(10.01,13.2) <<endl;

(完整代码见001_c_max.cpp)

#include <iostream>
using namespace std;

//(1)多个类型实现相同的功能,太过于繁琐;
int cmp(int a ,int b){
   
	return a > b ? a : b;
}
float cmp(float a ,float b){
   
	return a > b ? a : b;
}
double cmp(double a ,double b){
   
	return a > b ? a : b;
}
const string& cmp(const string& a ,const string & b){
   
	return a > b ? a : b;
}





int main(){
   
	cout << cmp(10,13) <<endl;
	cout << cmp(10.1F,13.2F) <<endl;  //(2)注意:float类型的写法;(和double进行区分;)
	cout << cmp(10.01,13.2) <<endl;
	cout << cmp("abc","def") <<endl;

}
1.5.1.2 函数模板的实际应用

(1)首先声明模板类型,然后将类型替换成模板,c++进行匹配

template <typename T>   //(1)首先声明模板类型,然后将类型替换成模板,c++进行匹配
T cmp(T a, T b)
{
   
	return a > b ? a : b;

}

(2)模板比较的问题:和实际不符合,类型定义的话,和实际符合;

cout << cmp(string("abc"),string("def")) << endl; //类型定义的话,和实际符合
	cout << cmp("abc","def") << endl;  //(2)模板比较的问题:和实际不符合

(完整代码见002_template_func.cpp)

#include <iostream>
using namespace std;

template <typename T>   //(1)首先声明模板类型,然后将类型替换成模板,c++进行匹配
T cmp(T a, T b)
{
   
	return a > b ? a : b;

}


int main(){
   
	cout << cmp<int> (10,13) <<endl;
	cout << cmp<float>(10.1F,13.0F) <<endl;
	cout << cmp<double>(10.1,13.2) <<endl;
	cout << cmp<string>((string("abc")),(string("def"))) <<endl;
	cout << cmp<string>("abc","def") << endl;

	cout << cmp(10,13) << endl;
	cout << cmp(10.1F,13.2F) << endl;
	cout << cmp(10.01,13.02) << endl;
	cout << cmp(string("abc"),string("def")) << endl; //类型定义的话,和实际符合
	cout << cmp("abc","def") << endl;  //(2)模板比较的问题:和实际不符合

}
1.5.1.3函数模板基础知识
  • 模板声明
  template <模板形参表> 函数返回类型 函数(形参表);
  • 模板定义
template <模板形参表>
函数返回类型 函数(形参表){
   
      函数体;
};

例如:

template <typename T> T Max(T a,T b){
   
        return a>b?a:b;
}
  • 模板实例化
函数(实参表)

产生模板特定类型的函数或者类的过程称为实例化
调用函数模板与调用函数完全一致。

  • 实例
    最值函数Max(),Min()
    字符串转数值Ston()

(***) 1.5.2 类模板

1.5.2.1类模板实际应用

(0)模板类的定义:注意T为class里面的数据类型;

template <typename T>  //(0)模板类的定义:注意T为class里面的数据类型;
class Array{
   
private:
	T* data;
	int length;

(0)调用的时候必须明确类型;

void TestInt(){
   
	Array<int> arr;    //(0)调用的时候必须明确类型
	arr.push_back(1);
	arr.push_back(2);
	arr.push_back(3);
	arr.push_back(4);
	for(int i = 0; i <arr.size();++i){
   
		cout << arr[i] <<endl;
	}
}
void TestDouble(){
   
	Array<double> arr;   //(0)调用的时候必须明确类型
	arr.push_back(1.0);
	arr.push_back(2.1);
	arr.push_back(3.2);
	arr.push_back(4.3);
	for(int i = 0; i <arr.size();++i){
   
		cout << arr[i] <<endl;
	}
}

(1)深拷贝的写法
(1.1)多开放一片空间;
(1.2)数据的拷贝;
(1.3)插入需要的数据;
(1.4)释放空间;

void push_back(T n){
     //(1)深拷贝的写法
	++length;
	T* temp = new T[length]; //(1.1)多开放一片空间;
	for(int i = 0; i <length -1;++i){
     //(1.2)数据的拷贝;
		temp[i] = data[i];
	}
	temp[length-1] = n; //(1.3)插入需要的数据
	delete []data;    //(1.4)释放空间
	data = temp;
	}

(2)遍历:必须【】运算符重载;

T& operator[](int i){
      //(2)遍历:必须【】运算符重载;
		return data[i];
	}

(完整代码见003_template_class.cpp)

#include <iostream>
using namespace std;

template <typename T>  //(0)模板类的定义:注意T为class里面的数据类型;
class Array{
   
private:
	T* data;
	int length;
public:

	Array():data(NULL),length(0){
   }
	~Array(){
   delete []data;}
	int size()const{
   return length;}
	void push_back(T n){
     //(1)深拷贝的写法
	++length;
	T* temp = new T[length]; //(1.1)多开放一片空间;
	for(int i = 0; i <length -1;++i){
     //(1.2)数据的拷贝;
		temp[i] = data[i];
	}
	temp[length-1] = n; //(1.3)插入需要的数据
	delete []data;    //(1.4)释放空间
	data = temp;
	}
	T& operator[](int i){
      //(2)遍历:必须【】运算符重载;
		return data[i];
	}

};

void TestInt(){
   
	Array<int> arr;    //(0)调用的时候必须明确类型
	arr.push_back(1);
	arr.push_back(2);
	arr.push_back(3);
	arr.push_back(4);
	for(int i = 0; i <arr.size();++i){
   
		cout << arr[i] <<endl;
	}
}
void TestDouble(){
   
	Array<double> arr;   //(0)调用的时候必须明确类型
	arr.push_back(1.0);
	arr.push_back(2.1);
	arr.push_back(3.2);
	arr.push_back(4.3);
	for(int i = 0; i <arr.size();++i){
   
		cout << arr[i] <<endl;
	}
}
void TestString(){
   
	Array<string> arr;
	arr.push_back("abc");
	arr.push_back("def");
	arr.push_back("fgh");
	arr.push_back("xyz");
	for(int i = 0; i <arr.size();++i){
   
	cout << arr[i] <<endl;
	}
}
int main(){
   
	TestInt();
	TestDouble();
	TestString();


}
1.5.2.2类模板基础知识
  • 模板声明
 template <模板形参表> class 类名;
  • 模板定义
 template <模板形参表>
    class 类名 {
   
    }
  • 模板实例化
类名<模板实参表> 对象;
  • 模板参数表
    多个模板参数之间,分割。模板参数,模板参数,...
  • 模板参数
  • 类型形参
    class 类型形参或者typename 类型形参
  • 非类型模版参数
    非类型模板的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值