C++ 模板與STL

鋸齒流沙發表於2017-12-27

引進模板意義:在程式設計時,我們有時會遇到這樣的情況:多個函式的功能相同或相似,只是資料型別不同。

如: 1)

int  min(int a, int b)
{
	if (a<b)
		return a;
	else
		return b;
}
複製程式碼

2)

double min(double a, double b)
{
	if (a<b)
		return a;
	else
		return b;
}
複製程式碼

3)

char min(char a, char b)
{
	if (a<b)
		return a;
	else
		return b;
}
複製程式碼

這三個函式業務邏輯一樣,資料型別不一樣。我們能否用如下通用函式表示呢?

T min(T a, T b)
{
	if (a<b)
		return a;
	else
		return b;
}
複製程式碼

可以,這就是函式模板。對於類的宣告來說,也有同樣的問題。有時,有兩個類或多個類,其功能相同,只是資料型別不同,這可以定義類别範本。

void myswap(int& a,int& b){
	int tmp = 0;
	tmp = a;
	a = b;
	b = tmp;
}

void myswap(char& a, char& b){
	char tmp = 0;
	tmp = a;
	a = b;
	b = tmp;
}
複製程式碼

以上兩個方法同樣可以定義成模板

template <typename T>
void myswap(T& a, T& b){
	T tmp = 0;
	tmp = a;
	a = b;
	b = tmp;
}
複製程式碼

執行

void main(){
	//根據實際型別,自動推導
	int a = 10, b = 20;
	myswap<int>(a, b);
	cout << a << "," << b << endl;

	char x = 'v', y = 'w';
	myswap(x, y);
	cout << x << "," << y << endl;

	system("pause");
}
複製程式碼

C++.png

模板的概念 模板(template)是C++的一個新的重要特性,它對具有相同功能的函式或類的再抽象,把資料型別引數化,用一種或多種抽象的型別來表示(稱為類屬型別),再用一個通用形式來表示多個功能相似而資料型別不同的函式或類,實現程式碼重用的目的。 實際使用時,再用具體的型別去替代模板中的類屬型別,這稱為例項化。

模板的種類:有兩種 函式模板:例項化的函式模板稱為模板函式; 類别範本:例項化的類别範本稱為模板類

C++.png

模板函式

函式模板只是模板的定義,定義中用到通用型別引數,不能直接執行; 模板函式是當編譯系統發現有一個函式呼叫:函式名(實參表) 時,根據實參表中的型別生成一個過載函式,它是一個實實在在的函式定義,具有程式程式碼; 模板函式的各引數之間必須保持完全一致的型別,不具有隱式的型別轉換;

template <typename T>
void myswap(T& a, T& b){
	T tmp = 0;
	tmp = a;
	a = b;
	b = tmp;
}
複製程式碼

函式模板的優點: 1)克服了C語言用大量不同函式名錶示相似功能的壞習慣;

2)克服了巨集定義不能進行引數型別檢查的弊端;

3)克服了C++函式過載用相同函式名字重寫幾個函式的煩瑣;

4)奠定了標準模板庫STL的基礎(該庫包含了許多在電腦科學領域裡常用的基本資料結構和基本演算法。為廣大軟體設計人員提供了一個可擴充套件的應用框架,體現了軟體的高度可複用性。)

類别範本

類别範本的定義

template < 型別形參表 >
class 類别範本名
{
private:
	私有成員定義
public:
	公有成員定義
protected:
	受保護成員定義
};
複製程式碼

說明: 類别範本的成員函式可以在模板內定義,也可以在模板外定義; 類别範本成員函式的模板外定義格式如下: template < 型別形參表 > 返回型別 類别範本名 <型別形參表>::函式名(形參表) { ...... }

說明:

1)類别範本只是模板的定義,定義中用到通用型別引數,不能直接執行;

2)模板類是實實在在的類定義,是類别範本的例項。可以將 類别範本名 <模板實參表> 看作是一個類;

3)利用模板類還可以定義物件,格式如下:

類别範本名 <模板實參表> 物件名

類别範本名 <模板實參表> 物件名([建構函式實參表])

template<class T>
class A{
public:
	A(T a){
		this->a = a;
	}
protected:
	T a;
};

//普通類繼承模板類
class B : public A<int>{
public:
	B(int a, int b) : A<int>(a){
		this->b = b;
	}
private:
	int b;
};

//模板類繼承模板類
template <class T>
class C : public A<T>{
public:
	C(T c, T a) : A<T>(a){
		this->c = c;
	}
protected:
	T c;
};

void main(){
	//例項化模板類物件
	//List<String> list;
	A<int> a(6);
	system("pause");
}
複製程式碼

標準模板庫

標準模板庫(Standard Template Library)是ANSI / ISO C++最有特色、最實用的部分之一 STL包含了以下三部分的內容:

容器類(container):是容納一組物件或物件集的類

迭代器(iterator):物件導向版本的指標,它提供了訪問容器或序列中每個物件的方法

演算法(algorithm):用來操作容器中的元素的函式模板

泛型演算法(generic algorithm)和函式物件(function object)的概念與使用使演算法擺脫了對不同型別資料個性操作的依賴,這樣就可以編出更具通用性的演算法。

具體的STL可以到網上檢視其包含內容的函式。

相關文章