本周學習的內容有點多,主要學習了C++中的模板(包括函數模板和類模板)、泛型編程概述和三種容器(vector,deque,list)。
模板
- 模板是C++的一種特性,允許函數或類(對象)通過泛型的形式表現或運行。
- 模板可以使得函數或類在對應不同的型別的時候正常工作,而無需為每一個型別都寫一份代碼。
例如,為求兩個數的最大值,我們定義MAX()函數需要對不同的數據類型分別定義不同版本。
//函數1.
int max(int x,int y);{return(x>y)?x:y ;}
//函數2.
long max( long x,long y){return (x>y)? x:y ;}
//函數3.
double max(double x,double y){return (x>y)? x:y ;}
如果使用模板就能省去一堆冗余代碼,
template <typename T> T max(T x, T y){return (x>y)? x:y ;}
C++中有兩種類型的模板
- 函數模板:使用泛型參數的函數
- 類模板:使用泛型參數的類
如果我們打算給模板函數(類)的某個特定類型寫一個函數,就需要用到模板的特化,實際上,所謂特化,就是代替編譯器完成了對指定類型的特化工作,現代的模板庫中,大量的使用了這個技巧。
對于偏特化,則只針對模板類型中部分類型進行特化,如
template<T1, T2>
class MyClass;
template<T1, T2>
class MyCalss<int, T2>//偏特化
泛型編程
泛型編程是一種編程方法,這種方法將型別以一種to-be-specified-later的方式給出,等到需要調用時,再以參數方式,通過具體的、特定的型別實例化一個具體的方法或對象。
面向對象編程關注的是編程的數據方面,而泛型編程關注的是算法。它們之間的共同點是抽象和創建可重用代碼,但它們的理念絕然不同。
泛型編程旨在編寫獨立于數據類型的代碼。在C++中,完成通用程序的工具是模板。模板使得能夠按泛型定義函數或類,而STL通過通用算法更進了一步。
迭代器
理解迭代器是理解STL的關鍵所在。模板使得算法獨立于存儲的數據類型,而迭代器使算法獨立于使用的容器類型。
什么是迭代器?
- 迭代器是指針的泛化
迭代器本身是一個對象,指向另外一個(可以被迭代的)對象
在STL中迭代器是容器于算法之間的接口
- 算法通常以迭代器作為輸入參數
容器只要提供一種方式,可以讓迭代器訪問容器中的元素即可
迭代器的基本思想
- 在STL中,迭代器最重要的思想就是分離算法和容器,使之不需要相互依賴
- 迭代器將算法和容器粘合在一起從而使得一種算法的實現可以運用到多種不同的容器上,如下面例子,find算法接受一對迭代器,分別指向容器的開始位置和最終位置:
template<class _lnlt,class _Ty>
inline _lnlt find(_lnlt _First,_lnlt _Last,const _Ty& _Val{
for(;_First != _Last; ++_First)
if(*_First == _Val)
break;
return _First;
}
find算法對于不同的容器均適用
using namespace std;
vector<int> v(...);
list<int> l(...);
deque<int> d(...);
vector<int>::iterator itv = find(v.begin(),v.end(),elementToFind);
list<int>::iterator itl = find(l.begin(),l.end(),elementToFind);
deque<int>::iterator itd = find(d.begin(),d.end(),elementToFind);