首先给出一个函数
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迭代器的实现可以看出,该迭代器并不是指向那些实实在在的序列。我们它指向的是一个虚拟序列,但如果你不知道它是怎么实现的,你或许就以为它指向的是实际的序列,而这也正是我们要的效果。