模板 模板就是把類型當做參數,假設有一下代碼 代碼1:
int max(int a, int b){ return (a > b) ? a; b; }char max(char a, char b){ return (a > b) ? a; b; }上述代碼的兩個函數邏輯結構相同,但是數據結構不一樣,要實現只編寫一個函數就能實現所有的這些函數,就要用到模板。 模板的關鍵字:template typename class(這里的class不是代表類,而是表示數據類型) 所以代碼1可以寫成如下模式 代碼1.1
template <class T>//class用typename代替也可以T max(T a, T b)//函數模板{ return (a > b) ? a; b;}int ival = max(100,99);//模板函數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);變量作為模板的參數如下代碼所示
tymplate<int size>void display(){ cout<<size<<endl;}display<10 >();多模板參數時方法如下代碼所示
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;//數據成員指針};//類外定義時大不相同template<class T>//所有成員函數都要加這一句void MyArray<T>::display(){ ....}int mian(){ MyArray<int> arr; arr.display(); return 0;}同時在這里需要注意的是在目前的開發環境下不能將類模板的聲明和實現分開編譯,即不能分別寫成.h和.cpp文件分開的樣式,可以全部寫在.h文件下,最后用include調用。
標準模板庫(STL) vector 向量,頭文件#include,其實就是數組的封裝,下面說一下用法
vector<T> v1;//保存類型為T的對象,默認構造函數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();//第一個數據back();//最后一個數據size();//數據個數push_back();//將數據插入向量尾部pop_back();//刪除尾部數據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) 映射模板存儲的數據都是成對出現的,頭文件#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;新聞熱點
疑難解答
圖片精選