<@乌龟:>浅谈STL中自己实现模板函数
采用STL来实现模板函数是非常简洁美观的,本文后面的一些内容将对这点进行一些简单的总结和讨论,如果想比较好的理解本文的内容,最好具备函数模板和STL的一些基本知识。
函数模板中最好多用迭代器(Iterators)来作为参数进行传递,迭代器可以简单的认为类似于指向数组的某个元素的指针。原因是这样可以做到非常的通用,比如到底参数是来自vector,list,或者set都是不重要的。首先要知道规范的命名。
迭代器类型的缩写
缩写 | 含义 |
In | 输入迭代器 |
Out | 输出迭代器 |
Fwd | 前向迭代器 |
Bid | 双向迭代器 |
Rand | 随机访问迭代器 |
在泛型算法中,同样需要注意的是传入的算符,算符相当于是一个函数,比如需要写一个CopyIf即选择性复制的算法,需要把一个int型的vector小于x的元素复制到另外一个vector中,就需要一个函数来判断是否里面元素的值小于x。一般来说,算符规范的命名为:
算符类型
缩写 | 含义 |
UnPred | 一元断言,带一个参数并返回布尔值 |
BinPred | 二元断言,带两个参数并返回布尔值 |
UnFunc | 一元函数,带一个参数并返回任意值 |
BinFunc | 二元函数,带两个参数并返回任意值 |
下面是一个简单的示例程序,实现了一个CopyIf的程序
1: # include <vector>
2: # include <list>
3: # include <string>
4: # include <iostream>
5: # include <algorithm>
6:
7: using namespace std;
8:
9: bool UnPredIsLess(int a)
10: {
11: if (a < 3) { return true; }
12: else { return false; }
13: }
14:
15: //选择性赋值的泛型算法
16: template <typename In, typename Out, typename UnPred>
17: void CopyIf(In first, In last, Out result, UnPred pred)
18: {
19: for (; first != last; first++)
20: {
21: if (pred(first))
22: {
23: *result ++ = *first;
24: }
25: }
26: }
27:
28: int main()
29: {
30: vector<int> vec1;
31: vec1.push_back(1);
32: vec1.push_back(2);
33: vec1.push_back(3);
34: vec1.push_back(4);
35: vec1.push_back(5);
36:
37: vector<int> vec2;
38:
39: CopyIf(vec1.begin(), vec1.end(), back_inserter(vec2), UnPredIsLess);
40:
41: for (vector<int>::iterator p = vec2.begin();
42: p != vec2.end(); p ++)
43: {
44: cout << *p << endl;
45: }
46:
47: string end;
48: cin >> end;
49: }
UnPredLess就是一个一元断言,将a与3比较,该CopyIf的功能就是将一个序列的值小于3的复制到另一个序列中。在这个程序里面,具体是采用的vector还是list还是set是没有关系的。断言可以是函数或者伪函数来实现,伪函数就是一个重载了运算符的类
back_inserter是另外一个需要注意的地方,采用这种写法可以不显式的指定第二个序列的大小,这个方法自动会调用push_back函数加入到序列的末端。