迭代器配接器
时间:2023-04-26 11:07:00
迭代器配接器的作用将通过一个例子来解释。具体来说,迭代器配解器的使用也可以扩展泛算法的通用性
迭代器配接器是将迭代器作为参数并转换为其他迭代器的模板
口头空谈太抽象和不真实,说很多可能无法理解,软件工程师看代码的能力一般比看中文的能力强,通过阅读代码理解更可靠,所以我们应该避免太多的舌头
我们作为示范的泛型算法模板如下
template
T find(T start, T beyond, const X& x)
{
while(start != beyond && *start != x)
start;
return start;
}
显然这个算法模板是从头往后找出第一个值为x的元素,并返回这个元素对应的迭代器
假设我们需要从头到尾找出第一个元素值为x的元素,我们需要重写泛算法吗?
答案是否定的,我们可以使用迭代器配接器find算法也适用于从头到尾搜索元素的场合,这显然可以使find进一步提高算法模板的通用性
示范代码如下:
#include
using namespace std;
template
T find(T start, T beyond, const X& x) ///泛算法模板
{
while(start != beyond && *start != x)
start;
return start;
}
template
class Rev //迭代器配解器
{
// It it; ///这三行代码必须注释才能编译不出错。VS编译器对模板的支持确实不好
//friend bool operator==(const Rev
//friend bool operator!=(const Rev
public:
It it; //it本应设定为私有成员的,为了通过vs编译器不得设置为公共
Rev();
Rev(It i) :it(i) {}
operator It() { return it; }
///将参数迭代器反向
Rev
Rev
{
Rev
--it;
return r;
}
Rev
Rev
{
Rev
it;
return r;
}
T& operator*()
{
It i = it;
--i;
return *i;
}
};
template
bool operator==(const Rev
{
return x.it == y.it;
}
template
bool operator!=(const Rev
{
return x.it != y.it;
}
typedef 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,确实是反向搜索元素
}
结论:泛算法不仅可以独立于类型和数据结构,还可以实现一般抽象。即使在两个步骤看起来完全相反的情况下,算法也可以通过迭代器配接器统一。
这样做太复杂了吗?界面是统一的,缺点是太晦涩难懂。也许你没有足够的能力