C++PrimerPlus(第6版)中文版:Chapter16.4泛型编程_概念_改进和模型_inserts.cpp

上一个例子是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值