资讯详情

迭代器配接器

迭代器配接器的作用将通过一个例子来解释。具体来说,迭代器配解器的使用也可以扩展泛算法的通用性 迭代器配接器是将迭代器作为参数并转换为其他迭代器的模板 口头空谈太抽象和不真实,说很多可能无法理解,软件工程师看代码的能力一般比看中文的能力强,通过阅读代码理解更可靠,所以我们应该避免太多的舌头

我们作为示范的泛型算法模板如下

template <class T, class X> T find(T start, T beyond, const X& x) { while(start != beyond && *start != x) start; return start; } 显然这个算法模板是从头往后找出第一个值为x的元素,并返回这个元素对应的迭代器 假设我们需要从头到尾找出第一个元素值为x的元素,我们需要重写泛算法吗?

答案是否定的,我们可以使用迭代器配接器find算法也适用于从头到尾搜索元素的场合,这显然可以使find进一步提高算法模板的通用性

示范代码如下:

#include <iostream> using namespace std; template <class T, class X> T find(T start, T beyond, const X& x) ///泛算法模板 { while(start != beyond && *start != x) start; return start; } template<class It, class T> class Rev //迭代器配解器 { // It it; ///这三行代码必须注释才能编译不出错。VS编译器对模板的支持确实不好 //friend bool operator==(const Rev<It,T>&, const Rev<It,T>&); //friend bool operator!=(const Rev<It,T>&, const Rev<It,T>&); public: It it; //it本应设定为私有成员的,为了通过vs编译器不得设置为公共 Rev(); Rev(It i) :it(i) {} operator It() { return it; } ///将参数迭代器反向 Rev<It,T>& operator () { --it; return *this; } Rev<It,T>& operator (int) { Rev<It,T> r = *this; --it; return r; } Rev<It,T>& operator--() { it; return *this; } Rev<It,T>& operator--(int) { Rev<It,T>& r = *this; it; return r; } T& operator*() { It i = it; --i; return *i; } }; template<class It, class T> bool operator==(const Rev<It,T>& x, const Rev<It,T>& y) { return x.it == y.it; } template<class It, class T> bool operator!=(const Rev<It,T>& x, const Rev<It,T>& y) { return x.it != y.it; } typedef Rev<int*,int> REV; void main() { int a[] = {0,7,2,3,4,5,6,7,8,9}; int *p = find(a, a 10, 8); //正向查找 cout << *p << endl; REV r = find(REV(a 10), REV(a), 7); ///反向搜索 cout << *r << endl; r--; cout << *r; //如果输出8,确实是反向搜索元素 }

结论:泛算法不仅可以独立于类型和数据结构,还可以实现一般抽象。即使在两个步骤看起来完全相反的情况下,算法也可以通过迭代器配接器统一。

这样做太复杂了吗?界面是统一的,缺点是太晦涩难懂。也许你没有足够的能力

标签: w轴向位移变送器配接ws

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台