C++沉思录读书笔记(19章)- 使用泛型迭代器将泛型算法应用到不同的场合

这回将介绍,如何使用不同的迭代器,将一个泛型算法应用到不同的场合

我将使用泛型算法Copy为例子,利用不同的迭代器去应用这个算法,此算法代码如下:

template <class In, class Out>
Out Copy(In start, In end, Out dest) //模板copy在名称空间std中已经包含,为与标准版本区别而命名为Copy
{
	while(start != end)
		*dest++ = *start++;
	return dest;
}


应用一:
使用char *作为迭代器,也就是将In和Out都实例化为char *来应用这个泛型算法
这个应用的目的是将由start和end限定的字符序列拷贝到以dest为开始位置的序列中,代码非常简单,如下所示:

#include <iostream>
using namespace std;
template <class In, class Out>
Out Copy(In start, In end, Out dest) //此模板在名称空间std中已经包含,为与标准版本区别而命名为Copy
{
	while(start != end)
		*dest++ = *start++;
	return dest;
}
void main()
{
	char * hello = "Hello ";
	char * world = "world";
	char message[15];
	char *p = message;
	p = Copy(hello, hello+6, p); //使用自定义的Copy泛型算法
	p = copy(world, world+5, p); //使用标准copy泛型算法
	*p = '\0';
	cout << message << endl;
}

运行结果为:

Hello world


应用二:
我们的目的是将一个整形等差数列存到一个整形数组中
显然这次Out将实例化为int *;而对于In,需要创建一个输入迭代器,这个迭代器命名为Constant_iterator
完整代码如下所示:

#include <iostream>
using namespace std;
template <class In, class Out>
Out Copy(In start, In end, Out dest) //此模板在名称空间std中已经包含,为与标准版本区别而命名为Copy
{
	while(start != end)
		*dest++ = *start++;
	return dest;
}

class Constant_iterator
{
private:
	int n;
	int c;  //存储差值
	friend bool operator!=(const Constant_iterator&, const Constant_iterator&);
	friend Constant_iterator operator+(const Constant_iterator&, int x);
public:
	Constant_iterator(int x=1, int m=1): n(x),c(m) {};
	Constant_iterator operator++(int)
	{
		Constant_iterator r = *this;
		n+=c;
		return r;
	}
	int operator*() { return n; }
};

bool operator!=(const Constant_iterator& a, const Constant_iterator& b)
{
	return a.n != b.n;
}

Constant_iterator operator+(const Constant_iterator& a, int x)
{
	Constant_iterator r = a;
	r.n += x*(r.c);
	return r;
}

void main()
{
	int x[100];
	Constant_iterator c(-1,-2);
	Copy(c, c+5, x);
	for(int i = 0;i<100; i++)
		cout << i << " " << x[i] << endl;
}

运行结果为:

0 -1
1 -3
2 -5
3 -7
4 -9


应用三:
应用二中,我们的输出迭代器是int *,这次我们将输出迭代器设置成为一个输出流迭代器,我们重新新定义一个输出流迭代器Ostream_iterator;输入迭代器同应用二
我们的目的是使用泛型算法输出一个等差数列,整体代码如下所示:

#include <iostream>
#include <iterator>
using namespace std;
template <class In, class Out>
Out Copy(In start, In end, Out dest) //此模板在名称空间std中已经包含,为与标准版本区别而命名为Copy
{
	while(start != end)
		*dest++ = *start++;
	return dest;
}

class Constant_iterator
{
private:
	int n;
	int c;  //存储差值
	friend bool operator!=(const Constant_iterator&, const Constant_iterator&);
	friend Constant_iterator operator+(const Constant_iterator&, int x);
public:
	Constant_iterator(int x=1, int m=1): n(x),c(m) {};
	Constant_iterator operator++(int)
	{
		Constant_iterator r = *this;
		n+=c;
		return r;
	}
	int operator*() { return n; }
};

bool operator!=(const Constant_iterator& a, const Constant_iterator& b)
{
	return a.n != b.n;
}

Constant_iterator operator+(const Constant_iterator& a, int x)
{
	Constant_iterator r = a;
	r.n += x*(r.c);
	return r;
}

template<class T>
class Ostream_iterator
{
private:
	ostream * strm;
	const char * str;
public:
	Ostream_iterator(ostream& os, const char * s): strm(&os), str(s) {}
	Ostream_iterator& operator++(int) { return *this; }
	Ostream_iterator& operator=(const T& t) 
	{
		*strm << t << str;
		return *this;
	}
	Ostream_iterator& operator*() { return *this;}
};

void main()
{
	Ostream_iterator<int> oi(cout, "\n");
	Constant_iterator c(-1,-2); //初值为-1,差值为-2
	Copy(c, c+5, oi); //数列长度为5
	//ostream_iterator<int> output(cout, "*");
	//copy(c, c+5, output);  //此句编译通不过,因为Constant_iterator还不完善,所以它步支持标准版本的copy
}
运行结果为:

-1
-3
-5
-7
-9


还可以将输入迭代器实例化为输入流迭代器,代码略


总结:在设计算法时我们可以指针进行操作,然后将其抽象,对于不存在指针的数据结构,我们构造它的迭代器来模拟指针操作。要注意,使用泛型算法的数据结构也许根本不存在,具体请参看应用二




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值