1.定义:大部分向数组序列写元素,意味着目标数组必须有足够的空间接受输出。
vector<int>v1;
//填充v1
vector<int>v2;
copy(v1.begin(),v1.end(),v2.begin());//错误
有一种办法可以在插入模式下进行操作来允许已经有的序列中任何位置插入一个新的对象。
插入迭代器是一个输出迭代器,它为其容器用一个适当的插入操作来替换所有对运算符的*的调用。
函数模板back_inserter为自己的容器参数创建这样的迭代器,从而对Push_back的调用来替换所有的输出操作
//修正上述例子
copy(v1.begin(),v1.end(),back_inserter(v2));
//还有一个front_inserter模板它只对双端队列和表起作用,对向量不支持因为向量没有push_front
通用情况下可以用
//在lst2的第n个元素之前开始插入对象
copy(lst1.begin(),lst1.end(),inserter(lst2,lst2.begin()+n))
2.常用的迭代器适配器
记住包含头文件#include<iterator>
IO流而设定的特殊迭代器ostream_itertor是一个输出迭代器,它能像输出流插入对象
//例如帮vector中的元素打印到cout中,每个元素之间用空格分开
copy(v1.begin(),v1.end(),ostream_iterator<int>(cout,""));
而istream_iterator是一个输入迭代器,从输出流读取元素
copy(istream_iterator<int>(cin),istream_iterator<int>,back_inserter(v1));
//下面用一个例子来说明:用向量的向量来产生一个图表
//注意:grid[f(x)][x] = '*';//y坐标是第一个
#include <iterator>
#include <iostream>
#include <vector>
using namespace std;
namespace{
typedef vector<char>row_type;
typedef vector<row_type>grid_type;
const int xmax = 15;//列数
const int ymax = xmax;//行数
}
void print_grid(const grid_type&grid){
grid_type::const_reverse_iterator yp;
for (yp = grid.rbegin();yp!=grid.rend();++yp)
{
//打印一行
copy(yp->begin(),yp->end(),ostream_iterator<char>(cout,""));
cout<<endl;
}
}
//图表函数
double f(double x){
//强迫固定在网格内部!
return x * x/ymax +1.0;
}
int main(){
grid_type grid;//行的向量
//初始化Y轴并清除第一象限
grid.reserve(ymax);
row_type blank_row(xmax);
blank_row[0] = '|';
for (int y =0;y<ymax;++y)
grid.push_back(blank_row);
//初始化X轴
grid[0][0] = '+';
for (int x =1;x< xmax;++x)
grid[0][x] = '-';
for (int x =1;x< xmax;++x)
grid[f(x)][x] = '*';//面向行
print_grid(grid);
system("pause");
return 0;
}
运行结果: