模板 模板就是把類型當(dāng)做參數(shù),假設(shè)有一下代碼 代碼1:
int max(int a, int b){ return (a > b) ? a; b; }char max(char a, char b){ return (a > b) ? a; b; }上述代碼的兩個函數(shù)邏輯結(jié)構(gòu)相同,但是數(shù)據(jù)結(jié)構(gòu)不一樣,要實現(xiàn)只編寫一個函數(shù)就能實現(xiàn)所有的這些函數(shù),就要用到模板。 模板的關(guān)鍵字:template typename class(這里的class不是代表類,而是表示數(shù)據(jù)類型) 所以代碼1可以寫成如下模式 代碼1.1
template <class T>//class用typename代替也可以T max(T a, T b)//函數(shù)模板{ return (a > b) ? a; b;}int ival = max(100,99);//模板函數(shù)char cval = max<char >('A','B');用typename的方式如下代碼
template<typename T>void swap(T& a, T& b){ T tmp = a; a = b; b = tmp;}int x = 20, y = 30;swap<int>(x, y);變量作為模板的參數(shù)如下代碼所示
tymplate<int size>void display(){ cout<<size<<endl;}display<10 >();多模板參數(shù)時方法如下代碼所示
template<typename T,typename C>void display(T a, C b){ cout << a << " " << b << endl;}int a=1024;string str="Hello world!";display<int ,string >(a,str);對于C++來說,同樣也存在著類模板,代碼如下所示
template<typename T>class MyArray{public: void display();PRivate: T *m_pArr;//數(shù)據(jù)成員指針};//類外定義時大不相同template<class T>//所有成員函數(shù)都要加這一句void MyArray<T>::display(){ ....}int mian(){ MyArray<int> arr; arr.display(); return 0;}同時在這里需要注意的是在目前的開發(fā)環(huán)境下不能將類模板的聲明和實現(xiàn)分開編譯,即不能分別寫成.h和.cpp文件分開的樣式,可以全部寫在.h文件下,最后用include調(diào)用。
標(biāo)準(zhǔn)模板庫(STL) vector 向量,頭文件#include,其實就是數(shù)組的封裝,下面說一下用法
vector<T> v1;//保存類型為T的對象,默認(rèn)構(gòu)造函數(shù)v1為空vector<T> v2(v1);//v2是v1的一個副本vector<T> v3<n, i>;//v3包含n個值為i的元素vector<T> v4(n);//v4包含初始化元素的n個副本empty();//判斷是否為空,返回bool類型begin();//返回向量迭代器的首元素end();//返回向量迭代器最后一個元素的下一個元素clear();//清空向量front();//第一個數(shù)據(jù)back();//最后一個數(shù)據(jù)size();//數(shù)據(jù)個數(shù)push_back();//將數(shù)據(jù)插入向量尾部pop_back();//刪除尾部數(shù)據(jù)int main(){ vector<int >vec; vec.push_back(10); vec.pop_back(); cout << vector.size() << endl; return 0;}若要刪除元素,可以l.erase(begin()+n),為刪除第n個元素。
迭代器iterator,通過迭代器我們可以訪問對象的每個元素
int main(){ vector vec; vec.push_back("hello"); vector<string >::iterator citer=vec.begin(); for(;citer!=vec.end();citer++){ cout<<*citer<<endl; } return 0;}鏈表模板(list) 鏈表模板的特點是插入速度快,頭文件#include,遍歷只能用迭代器
list<int>::iterator itor = list.begin();for (; itor != list.end(); itor++){ cout << *itor << endl;}映射模板(map) 映射模板存儲的數(shù)據(jù)都是成對出現(xiàn)的,頭文件#include
map<int, string> m;pair<int, string>p1(10, "SH");//pair定義若干對pair<int, string>p2(20, "BJ");m.insert(p1);m.insert(p2);cout << m[10] << endl;cout << m[20] << endl;新聞熱點
疑難解答
圖片精選