STL模板入门到精通(一)

一、何为STL

STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。STL是一些容器的合集,其目的在于标准化组件。STL现在是C++的一部分,因此不用安装额外的库文件。

二、模板 template

作用:将类型作为参数,从而编写更加抽象的类和函数。
原本为了实现一致地函数,我们需要不断地将函数重载,可是在模板库的作用下,利用泛型编程只需要提供一个函数即可。

1、函数模板

使用模板前的程序:

#include 
#include 
using namespace std;

char mymax(char a,char b){
	cout << "char " << endl;
	return a>b?a:b;	
}

int mymax(int a,int b){
	cout << "int " << endl;
	return a>b?a:b;	
}

double mymax(double a,double b){
	cout << "double " << endl;
	return a>b?a:b;	
}

const char *mymax(const char* a,const char* b){
	//return a>b?a:b;	
	return strcmp(a,b)>0?a:b;
}
int main(){
	mymax('a','b');
	mymax(1,3);
	mymax(1.2,3.4);
	short a=1,b=2;
	mymax(a,b);
	mymax("hello","world");
	//mymax(1,2.34);//mymax(int,double) --> mymax(int,int)  mymax(double,double)
	return 0;	
}

使用模板后的程序:

#include 
#include 
#include 
using namespace std;

//函数模板   泛型编程
template
T mymax(T a,T b){
	cout << typeid(T).name() << endl;
	return a>b?a:b;	
}

//特化版本的函数
template<>
const char* mymax(const char* a,const char* b){
	cout << "const char*" << endl;
	return strcmp(a,b)>0?a:b;
}

int main(){
	cout << mymax(1,3) << endl;
	cout << mymax(3.14,2.39) << endl;
	cout << mymax('a','b') << endl;
	cout << mymax('a','b') << endl;
	cout << mymax("hello","world") << endl;	
	return 0;	
}

针对特定的类型,需要些特定的函数版本,否则在编译过程中,会找不到匹配的函数。
求一个数组中的最大值:

#include 
#include 
using namespace std;

template
K maxOfArr(K arr[],size_t len){
	K m = arr[0];
	for(size_t i=0;i
const char* maxOfArr(const char* arr[],size_t len){
	const char *m = arr[0];
	for(int i=0;i(arr,3) << endl;
	double brr[4] = {1,2.3,3.2,2.7};
	cout << maxOfArr(brr,4) << endl;
	const char * crr[5] = {"zhaoyun","guanyu","machao","huangzhong","zhangfei"};
	cout << maxOfArr(crr,5) << endl;
	cout << maxOfArr(arr,3) << endl;
	cout << maxOfArr(brr,4) << endl;
	cout << maxOfArr(crr,5) << endl;
	return 0;	
}

2、类模板

以实现堆栈为例:

#include 
#include 
using namespace std;

template
K maxOfArr(K arr[],size_t len){
	K m = arr[0];
	for(size_t i=0;i
const char* maxOfArr(const char* arr[],size_t len){
	const char *m = arr[0];
	for(int i=0;i(arr,3) << endl;
	double brr[4] = {1,2.3,3.2,2.7};
	cout << maxOfArr(brr,4) << endl;

	const char * crr[5] = {"zhaoyun","guanyu","machao","huangzhong","zhangfei"};
	cout << maxOfArr(crr,5) << endl;
	cout << maxOfArr(arr,3) << endl;
	cout << maxOfArr(brr,4) << endl;
	cout << maxOfArr(crr,5) << endl;
	return 0;	
}

全特化:虽然函数逻辑相同但是需要将类里的函数全部重写;

#include 
#include 
using namespace std;

template
class Max{
public:
	void show(){
		cout << a << " : " << b << endl;	
	}
	Max(T a,T b):a(a),b(b){
		cout << "T" << endl;	
	}
	T max(){
		return a>b?a:b;	
	}
	T min(){
		return a>b?b:a;	
	}	
private:
	T a;
	T b;
};

//特化版本
template<>
class Max{
public:
	Max(const char* a,const char *b):a(a),b(b){
		cout << "const char*" << endl;	
	}
	
	void show(){
		cout << a << " : " << b << endl;	
	}
	
	const char *max(){
		return strcmp(a,b)>0?a:b;	
	}
	const char *min(){
		return strcmp(a,b)>0?b:a;
	}
private:
	const char* a;
	const char* b;
};

int main(){
	Max m1(1,3);
	cout << m1.max() << endl;
	Max m2(2.3,2.1);
	cout << m2.min() << endl;

	Max m3("Hello","World");
	cout << m3.max() << endl;
	m3.show();
	return 0;	
}

成员特化:只需将特定的成员函数实现特化的版本;

#include 
#include 
using namespace std;

template
class Max{
public:
	void show(){
		cout << a << " : " << b << endl;	
	}
	Max(T a,T b):a(a),b(b){
		cout << "T" << endl;	
	}
/*
	template 
	const char *max(){
		cout << "成员特化版本" << endl;
		return strcmp(a,b)>0?a:b;	
	}
*/
	T max(){
		return a>b?a:b;	
	}
	//声明成员特化的版本
	template 
	const char *max();
	T min(){
		cout << "非物化版本的成员函数" << endl;
		return a>b?b:a;	
	}
	//声明成员特化的版本
	template 
	const char *min();
	/*
	{
		cout << "成员特化版本" << endl;
		return strcmp(a,b)>0?b:a;	
	}
	*/
private:
	T a;
	T b;
};
//成员函数特化版本的函数
//在类外实现  在类里面实现是没有效果的!!!
template<>
const char * Max::max(){
	cout << "成员特化版本" << endl;
	return strcmp(a,b)>0?a:b;	
}
template<>
const char * Max::min(){
	cout << "成员特化版本" << endl;
	return strcmp(a,b)>0?b:a;
}
//不再重写类里的全部函数
/*
template<>
class Max{
public:
	Max(const char* a,const char *b):a(a),b(b){
		cout << "const char*" << endl;	
	}
	
	void show(){
		cout << a << " : " << b << endl;	
	}
	
	const char *max(){
		return strcmp(a,b)>0?a:b;	
	}
	const char *min(){
		return strcmp(a,b)>0?b:a;
	}
private:
	const char* a;
	const char* b;
};
*/

int main(){
	Max m1(1,3);
	cout << m1.max() << endl;
	Max m2(2.3,2.1);
	cout << m2.min() << endl;

	Max m3("Hello","World");
	cout << m3.max() << endl;
	cout << m3.min() << endl;
	
	m3.show();

	return 0;	
}

偏特化:根据特化程序的高低选择实例化合适的类模板;只有类才有,函数的偏特化其实就是重载;

#include 
using namespace std;

template
class A{
public:
	void show(){
		cout << "" << endl;
	}
};

//偏特化
template
class A{
public:
	void show(){
		cout << "" << endl;
	}	
};

template
class A{
public:
	void show(){
		cout << "" << endl;	
	}
};

template
class A{
public:
	void show(){
		cout << "" << endl;	
	}
};
template
class A{
public:
	void show(){
		cout << "" << endl;
	}
};

int main(){
	//根据特化程序的高低选择实例化合适的类模板 
	A a;
	a.show();
	A b;
	b.show();
	A c;
	c.show();
	//指针的偏特化  TKK  T T*  T*
	A d;
	d.show();
	//数组的偏特化              T  T[]  T[]
	A e;
	e.show();
	return 0;	
}

你可能感兴趣的:(STL)