上一个例子是copyit.cpp。本博文主要是讲另外三种迭代back_insert_iterator,front_insert_iterator,和insert_iterator。这三种迭代器也将提高STL算法的通用性。很多STL函数都和copy()是类似的,将结果发送到输出迭代器的指示的位置。
下面这段语句:
copy(casts,casts,dice.begin())
这些值将覆盖dice中以前的内容,且该函数假设dice有足够的空间,能容纳这些值。也即是说copy()不能自动根据发送值来调解目标容器的长度。如果预先并不知道dice 的长度,或者想将元素添加到dice中,而不是覆盖已有的内容,该怎么做呢?
答案就是用这三种迭代器:back_insert_iterator,front_insert_iterator,和insert_iterator。插入将添加心的元素,而不会覆盖原来的元素,并使用自动内存分配来确保能够容纳新的信息。back_insert_iterator将元素插入到容器的尾部,front_insert_iterator将元素插入到容器的前端。最后,insert_iterator将可以用一个参数来指出插入的位置。
这些迭代器将容器类型作为模版参数,将实际的容器标识符作为构造函数的参数。要为名为dice的vector<int> 容器创建一个back_insert_iterator,可以这样写:
back_insert_iterator<vector<int>> back_iter(dice);
声明front_insert_iterator的方式与此相同。
对于insert_iterator,还需要额外指出插入的位置:
insert_iterator<vector<int>> inset_iter(dice,dice.begin());
下面的例子演示了迭代器的用法,还有使用for_each() 而不是ostream迭代器进行输出。
// Example16.11inserts.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
#include <iterator>
#include <vector>
#include <algorithm>
void output(const std::string& s) { std::cout << s << " "; }
int main()
{
// std::cout << "Hello World!\n";
using namespace std;
string s1[4] = { "fine","fish","fashion","fate" };
string s2[2] = { "busy","bats"};
string s3[2] = { "silly","singers" };
vector <string> words(4);
copy(s1,s1+4,words.begin());//该语句把s1 拷贝到了vector words 中
for_each(words.begin(),words.end(),output);
cout << endl;
//construct anonymous back_insert_iterator object 构建匿名insert back_insert_iterator对象
copy(s2,s2+2,back_insert_iterator<vector<string>> (words));//该句会在words的末尾插入s2,
// 此时输出为:fine fish fashion fate busy bats
for_each(words.begin(), words.end(), output);
cout << endl;
//construct anonymous insert_iterator object 构建匿名insert_iterator对象
copy(s3, s3 + 2, insert_iterator<vector<string>>(words,words.begin()));//该句会在words的开始处插入s3,
// 此时输出为:silly singers fine fish fashion fate busy bats
for_each(words.begin(), words.end(), output);
cout << endl;
}
运行结果:
fine fish fashion fate
fine fish fashion fate busy bats
silly singers fine fish fashion fate busy bats