泛型编程 generic programming (GP)。
标准模块库 standard template library (STL)。
STL两个部分:容器vector list (序列式容器 sequential container ) set map(关联式容器 associate container)。
map 一对对的 key /value 组合。
set 很多key 的集合。
泛型算法 find() sort() replace() merge()。
两个技术达到generic 函数模板(template) 与类型无关。
iterator 与容器类别无关。
实现和应用举例
vector<int> vec(10)
vec[5] = 10 //这样做是合法的。
函数模板
template <typename elemType>
elemType* find(const vector<elemType> &vec,const elemType &value)
{
}
解决与容器类别无关化。iterator 登场了。登场之前应该是用指针来替代数组和VECTOR首地址。指针只人地址。不管你的类别。
vector 和 array 的区别: vector 可以是空的 而 array 不能是空的。单二者都使用连续的内存块。
这样就是算法和 具体的 vector 或者 array 容器无关了。
不过,list map set 还不行。
具体实现就是定义 一些类 iterator 。该类拥有 比较 前进等运算符的重载。
下边是个例子程序,展示使用iterator.
这样就大致表现了iterator 的用法。
一些容器的泛型算法举例
vector<int> ivec; vector<int> ivet(10); vector<int> ivec(10,-1) ; vector<int> ivec(ia,ia+8) //ia[20]; vector<int> ivec1(ivec2);
list<string> slist; list<string> slist(20); list<string> slist(20,"unassigned"); list<string> slist(ia,ia+8); list<string> slist1(slist2);
push_back()
如何设计一个泛型算法?这比设计一个容器简单得多了。
要做的工作一个就是用木板屏蔽参数类型,用迭代器屏蔽容器类型,用 函数对象 扩大功能。
下面该是讨论让泛型算法更猛的东西了。比如以个find_if().可以让他的比较 == > <.等。这就是 函数指针或者 函数对象做 参数的问题了。使用函数对象主要是为了效率。
一般function object 更常用。
配接器(adapter)