上一个例子是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
本文介绍了STL中的back_insert_iterator, front_insert_iterator和insert_iterator,这些迭代器用于在容器中插入元素而不是覆盖已有内容。例如,back_insert_iterator将元素添加到容器尾部,front_insert_iterator则在容器前端插入,而insert_iterator允许指定插入位置。通过使用这些迭代器,可以灵活地在不知道目标容器长度或希望追加元素的情况下进行操作。示例代码展示了如何使用这些迭代器在vector中插入字符串,以及与for_each()函数配合使用。

被折叠的 条评论
为什么被折叠?



