c++沉思录笔记(19章代码上集)

首先给出一个函数

template <typename In, typename Out>
Out copy(In start, In end, Out dest)
{
	while (start != end) {
			*dest++ = *start++;
	}
	return dest;
}

在主函数中,我们可以这样调用它

int _tmain(int argc, _TCHAR* argv[])
{
	int x[10];
	int a[10] = {10,20,30,40,50,60,70,80,90,100};
	copy(a, a+10, x);
	for (int i = 0; i != 10;++i)
	{
			std::cout << x[i] <<" ";
	}
	std::cout << std::endl;
	return 0;
}

然而我们发现, 对于copy函数的两个类型形参(In、Out)只需要满足输入迭代器、输出迭代器的要求即可。只需支持相等(==、!=)比较以及++自增操作符和*解引用运算。 甚至迭代器不必真正的指向一个实实在在的序列。

于是,引出了虚拟序列的概念。

为了说明虚拟序列,我们首先创建一个用来读取相同常量值序列的输入迭代器(Constant_iterator)。可用作将数组的元素设为某个特定值。

先给出Constant_iterator类的代码

#ifndef CONSTANT_ITERATOR_H_INCLUDED
#define CONSTANT_ITERATOR_H_INCLUDED

class Constant_iterator {
		friend int operator==(const Constant_iterator&,
							  const Constant_iterator&);
		friend int operator!=(const Constant_iterator&,
							  const Constant_iterator&);
		friend Constant_iterator operator+(int, const Constant_iterator&);
		friend Constant_iterator operator+(const Constant_iterator&, int);
public:
		Constant_iterator(int = 0);
		int operator*() const;
		Constant_iterator& operator++();
		Constant_iterator operator++(int);
		Constant_iterator& operator+=(int);
private:
		int n;
		int count;
};
#endif

#include "stdafx.h"
#include "Constant_iterator.h"

Constant_iterator::Constant_iterator(int x): n(x), count(1) { }

int Constant_iterator::operator*() const { return n; }

Constant_iterator& Constant_iterator::operator++()
{
		++count;
		return *this;
}

Constant_iterator Constant_iterator::operator++(int)
{
		Constant_iterator it = *this;
		++count;
		return it;
}

Constant_iterator& Constant_iterator::operator+=(int x)
{
		count += x;
		return *this;
}

/
// 友元函数
int operator==(const Constant_iterator& it1, const Constant_iterator& it2)
{
		return (it1.n == it2.n && it1.count == it2.count);
}
int operator!=(const Constant_iterator& it1, const Constant_iterator& it2)
{
		return !(it1 == it2);
}
Constant_iterator operator+(int n, const Constant_iterator& it)
{
		Constant_iterator it2;
		return it2 += n;
}
Constant_iterator operator+(const Constant_iterator& it, int n)
{
		Constant_iterator it2;
		return it2 += n;
}

再来看看我们现在可以做些什么

int _tmain(int argc, _TCHAR* argv[])
{
	int x[10];
	Constant_iterator c(0);
	copy(c, c+10, x);
	for (int i = 0; i != 10;++i)
	{
			std::cout << x[i] <<" ";
	}
	std::cout << std::endl;
	return 0;
}

我们可以用我们写的Constant_iterator迭代器作为参数调用一开始我们基于那些实实在在的序列而编写的copy函数。

而很显然,从Constant_iterator迭代器的实现可以看出,该迭代器并不是指向那些实实在在的序列。我们它指向的是一个虚拟序列,但如果你不知道它是怎么实现的,你或许就以为它指向的是实际的序列,而这也正是我们要的效果。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值