c++是一門多范式的語言,其中就包括泛型,泛型有可以細分為泛型方法和泛型類。無處不在的stl,就是泛型最經典的應用場景。c++泛型的實現原理就是在調用時傳入真正的類型。其泛型相比於java,本人感覺不太好用,定義命名時也有些冗余,先上代碼。
//記住這些經典的代碼,它可以讓你理解語言
//但是c++的參數類型使泛型也變的有點難了,比如max(12,13),max(i,j)等
template <typename T> T max(T a,T b){ if(a>b){ return a} else{ return b;
} } // 可以看到,雖然理論上T可以是任意類型,但是其必須支持比較操作>,c++沒有對類型進行限定,但並不是傳人任意類型就可以的。
stl中還有一個非常重要的概念:迭代器,其目的就是為操作容器中的元素。數組指針就是一個經典的迭代器。
//這是一個泛型的常量前向迭代器,可以改變容器中元素大值,可讀可寫
template <typename T> struct list_iterator { list_iterator(list_entry<T> *entry):entry(entry){ } T& operator*(){ cout<<"the T& has been used"<<endl; return entry->value; } //常量對象調用 const T& operator*() const{ cout<<"the const T& has been used"<<endl; return entry->value; } // it.operator++(),使用int來區分前綴和后綴 list_iterator<T>& operator++(int){ entry= entry->next;
//this是指針,*this返回了對象 return *this; } // !=重載這個符號, 返回為bool,while,if等判斷條件。 bool operator!=(list_iterator<T> other){ //成員指針是否指向同一個地址 if(other.entry== entry){ return false; }else{ return true; } } list_entry<T> * entry; };
其vector,list,set,map和java中的容器有異曲同工之妙,不同之處在於java中容器提供的接口更統一,方法更多,還有很多工具類,反之,c++就比較簡陋了,但是其可以基本類型為泛型參數,寫起來更簡潔一些。看一些c++中stl的經典寫法。
int a = {2,32,32,90}; vector<int> vt (a,a+4); // 數組轉換為vector。 set<int> s(v.begin(),v.end()) ; // vector轉換為set bool flag=s.insert(value).second; // set會返回添加是否成功 map<int,int> m; // 可以用來對整數計數. m[n] ++;