<@乌龟:>浅谈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函数加入到序列的末端。

posted on 2009-07-31 00:43  乌龟_毛驴  阅读(507)  评论(0编辑  收藏  举报

导航