無論是函數模板仍是類模板,在未初始化前都是不佔用內存的。 另一般來講模板代碼不能分開編譯,即不能分開寫成.h文件和.c文件,須要寫成一個文件。ios
關鍵字:函數
1.類型做爲模板參數
舉個例子:spa
template <class T> T max(T a,T b) { return (a>b)?a:b; } int ival = max<int>(100,99);
2.變量做爲模板參數
舉個例子:指針
template <int size> void display() { cout<<size<<endl; } display<10>();
3.多參數函數模板
舉個例子code
template <typename T,typename C> void display(T t,C c) { cout<<t<<c<<endl; } int a = 666; string str = "marsggbo"; dispaly<int,string>(a,str);
4.數據類型和變量混用
仍是舉個栗子:blog
template <typename T,int size> void display(T t) { int i = 0; while(i++<size) { cout<<t<<endl; } } dispaly<int,6>(6);
template <typename T> class A { public: A(T a); T display() { return A.a; } private: T a; }
每定義一個成員函數時都須要在前面加上template關鍵字,另外在類名後還須要加上類型,即 <T> ,舉個栗子:內存
template <typename T> A::A(T x) { A.a = x; } template <typename T> T A<T>::display() { ... }
實例化類模板ci
int main(void) { A<int> test; test.display(); return 0; }
特別注意,end() 返回的是向量迭代器末元素的下一個元素,因此若是要訪問最後一個元素,表達式是這樣的: *(--vector.end()) ,(ps:注意前面有個*號)string
代碼示例:
記得引入vector頭文件it
#include <iostream> #include <vector> using namespace std; int main (void) { vector<int> vec(6,6); // 初始化爲6個6 vec.push_back(5); // 在末尾插入一個數據 cout<<vec.size()<<endl; //vector的長度(數據數量) vec.pop_back(); // 刪除末尾的一個數據 cout<<vec.size()<<endl; // 遍歷 for(int i=0;i<vec.size();i++) { cout<<vec[i]<<endl; } return 0; } >>> 7 6 6 6 6 6 6 6
迭代器至關於指針,要想訪問數據,須要加上*號
直接看栗子吧
int main(void) { vector<string> vec(2,"hello "); vec.push_back("marsggbo"); vector<string>::iterator citer = vec.begin(); cout<<*(--vec.end())<<endl; for(;citer!=vec.end();citer++){ cout<< *citer << endl; } return 0; } >>> marsggbo hello hello marsggbo
注意鏈表遍歷的時候不能使用取下標的方式,只能經過迭代器進行遍歷。
int main(void) { list<int> t; t.push_back(6); t.push_back(65); t.push_back(66); list<int>::iterator itor = t.begin(); for(;itor!=t.end();itor++) { cout<<*itor<<endl; } return 0; }
這個有點相似於Python中的字典。使用的關鍵字是map和pair
使用示例:
int main(void) { map<int,string> m; pair<int ,string> p1(666,"marsggbo"); pair<int ,string> p2(222,"hexin"); m.insert(p1); m.insert(p2); cout<<m[666]<<endl; cout<<m[222]<<endl; return 0; } >>> marsggbo hexin
map的遍歷方法:(仍是以上面的例子作基礎)
int main(void) { map<int,string> m; pair<int ,string> p1(666,"marsggbo"); pair<int ,string> p2(222,"hexin"); m.insert(p1); m.insert(p2); map<int,string>::iterator itor = m.begin(); for(;itor!=m.end();itor++) { cout<< itor->first <<":"; // 輸出鍵 cout<< itor->second << endl; // 輸出值 } } >>> 222:hexin 666:marsggbo