文章目录
- 1.模板基础知识
- 2. 标准
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 类型形参
- 非类型模版参数
非类型模板的