重学c++(六)
一、泛型编程
1、如果说面向对象是一种通过间接层来调用函数,以换取一种抽象,那么泛型编程则是更直接的抽象,他不会因为间接层而损失效率;
不同于面向对象的动态期多态,泛型编程是一种静态器多态,通过编译器生成最直接的代码;
泛型编程可以将算法与特定类型、结构剥离,尽可能复用代码。
2、例子
template<int n> struct Sum { enum Value{N = Sum<n-1>::N+n}; }; template<> struct Sum<1> { enum Value{N = 1}; }; int main() { cout << Sum<100>::N << endl; return 0; }
二、STL(Standard Template Library)
1、STL算法是泛型的,不与任何特定数据结构和对象绑定,不必在环境类似的情况下重写代码;
STL算法可以量身定做,并且具有很高的效率;
STL可以进行扩充,可以编写自己的组件并且能与STL标准的组件进行很好的
2、总体

3、1)序列式容器(其中元素是可排序的;vector list deque;而stack queue priority_queue是容器适配器)
struct Display { void operator()(int i) { cout << i << " "; } }; ........ int iArr[] = { 1,2,3,4,5 }; vector<int>iVector(iArr, iArr + 4); for_each(iVector.begin(), iVector.end(), Display());
2)关联式容器(每个数据元素都是由一个键key和值value组成,当元素被插入到容器时,按其键以某种特定规则放入适当位置;set multiset map multimap)
三、仿函数
所谓的仿函数是通过重载()运算符模拟函数形为的类
//c++一般实现 bool MySort(int a, int b) { return a < b; } void Display(int a) { cout << a << " "; } //c++泛型实现 template<typename T> bool MySortT(T const& a, T const& b) { return a < b; } template<typename T> inline void DisplayT(T const& a) { cout << a << " "; } //c++仿函数实现 struct SortF { bool operator()(int a, int b) { return a < b; } }; struct DisplayF { void operator()(int a) { cout << a << " "; } }; //c++仿函数模板实现 template<typename T> struct SortFT { inline bool operator()(T const& a, T const& b) const { return a < b; } }; template<typename T> struct DisplayFT { inline void operator()(T const& a) const { cout << a << " "; } }; int main() { //c++一般方式 int arr1[] = { 4,1,3,2,7 }; sort(arr1, arr1 + 5, MySort); for_each(arr1, arr1 + 5, Display); cout << endl; //c++泛型 int arr2[] = { 4,1,3,2,7 }; sort(arr2, arr2 + 5, MySortT<int>); for_each(arr2, arr2 + 5, DisplayT<int>); cout << endl; //c++仿函数 int arr3[] = { 4,1,3,2,7 }; sort(arr3, arr3 + 5, SortF()); for_each(arr3, arr3 + 5, DisplayF()); cout << endl; //c++仿函数末模板 int arr4[] = { 4,1,3,2,7 }; sort(arr4, arr4 + 5, SortFT<int>()); for_each(arr4, arr4 + 5, DisplayFT<int>()); cout << endl; return 0; }

浙公网安备 33010602011771号