c++中的stl和泛型

  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] ++;