迭代适配器(一) back_insert和front_insert的简单实现

当我们调用copy函数时,要确保目标容器足够大,例如:

//将vec的所有元素拷贝到以coll.begin()为起始地址的位置
copy(vec.begin(), vec.end(), coll.begin());

如果之前没有为coll分配好足够的内存,就会引发越界错误。

如果我们无法提前为coll预分配内存,可使用如下代码:

//将vec的所有元素拷贝到以coll.begin()为起始地址的位置
copy(vec.begin(), vec.end(), back_insert(coll.begin()));

back_insert是一种插入迭代器,插入迭代器就是帮我们屏蔽插入元素的细节,使得iter看起来总是指向一个"可用的位置"。

需要注意一下几点:

1.插入迭代器本质上是一种适配器,但是它看起来像一个迭代器,行为像一个迭代器,那么他就符合迭代器的定义。

2.插入迭代器的赋值,内部采用了插入元素的做法,可能调用容器的push_back push_front或者insert等。

3.插入迭代器的++操作,只是个幌子,但必不可少。以上面的copy为例,内部肯定调用了iter++,因为copy函数只是把它当做普通迭代器。

4.解引用操作同样也是幌子。

back_insert和front_insert实现代码如下:

 1 #ifndef ITERATOR_H
 2 #define ITERATOR_H
 3 #include <iterator>
 4
 5 //BackInsertIterator
 6 template <typename Container>
 7 class BackInsertIterator
 8 {
 9 public:
10     typedef typename Container::value_type value_type;
11
12     explicit BackInsertIterator(Container &cont)
13         :_cont(cont)
14     { }
15
16     BackInsertIterator<Container> &operator= (const value_type &val)
17     {
18         _cont.insert(_cont.end(), val);
19         return *this;
20     }
21
22     BackInsertIterator<Container> &operator*()
23     { return *this; }
24
25     BackInsertIterator<Container> &operator++()
26     { return *this; }
27
28     BackInsertIterator<Container> &operator++(int)
29     { return *this; }
30 private:
31     Container &_cont;
32 };
33
34 template <typename Container>
35 BackInsertIterator<Container> backInsert(Container &c)
36 { return BackInsertIterator<Container>(c); }
37
38
39 //FrontInsertIterator
40 template <typename Container>
41 class FrontInsertIterator
42 {
43 public:
44     typedef typename Container::value_type value_type;
45
46     explicit FrontInsertIterator(Container &cont)
47         :_cont(cont)
48     { }
49
50     FrontInsertIterator<Container> &operator= (const value_type &val)
51     {
52         _cont.insert(_cont.begin(), val);
53         return *this;
54     }
55
56     FrontInsertIterator<Container> &operator*()
57     { return *this; }
58
59     FrontInsertIterator<Container> &operator++()
60     { return *this; }
61
62     FrontInsertIterator<Container> &operator++(int)
63     { return *this; }
64 private:
65     Container &_cont;
66 };
67
68 template <typename Container>
69 FrontInsertIterator<Container> frontInsert(Container &c)
70 { return FrontInsertIterator<Container>(c); }
71
72 #endif
时间: 2025-01-07 11:08:50

迭代适配器(一) back_insert和front_insert的简单实现的相关文章

STL 迭代器适配器(iterator adapter)

iterator adapter graph LR iterator --- reverse_iterator iterator --- Insert_iterator iterator --- iostream_iterator Insert_iterator --- back_insert_iterator Insert_iterator --- front_insert_iterator Insert_iterator --- insert_iterator 插入迭代器:将一般迭代器的赋值

瀑布式开发、迭代开发、敏捷开发、XP与SCRUM的区别

瀑布式开发.迭代开发,区别[都属于,生命周期模型]         两者都是一种开发模式,就像设计模式一样,考虑的角度不一样,个人感觉谈不到取代一说. 传统的瀑布式开发,也就是从需求到设计,从设计到编码,从编码到测试,从测试到提交大概这样的流程,要求每一个开发阶段都要做到最好.特别是前期阶段,设计的越完美,提交后的成本损失就越少.我现在从事的外包项目就是这样的流程. 迭代式开发,不要求每一个阶段的任务做的都是最完美的,而是明明知道还有很多不足的地方,却偏偏不去完善它,而是把主要功能先搭建起来为目

Android:ListView和适配器的使用

ListView作用:将数据填充到布局 实例:下载>> Listview与适配器ArrayAdapter配合使用,ArrayAdapter比较简单,但它只能用于显示文字.布局文件可以自己写,也可以用系统的. 在布局文件中加入一个ListView控件: <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wra

【Python数据挖掘课程】九.回归模型LinearRegression简单分析氧化物数据

这篇文章主要介绍三个知识点,也是我<数据挖掘与分析>课程讲课的内容.同时主要参考学生的课程提交作业内容进行讲述,包括:        1.回归模型及基础知识:        2.UCI数据集:        3.回归模型简单数据分析. 前文推荐:       [Python数据挖掘课程]一.安装Python及爬虫入门介绍       [Python数据挖掘课程]二.Kmeans聚类数据分析及Anaconda介绍       [Python数据挖掘课程]三.Kmeans聚类代码实现.作业及优化 

&nbsp; &nbsp; &nbsp; &nbsp; 基于bind的简单DNS搭建

我们都知道互联网通信是基于IP地址的,然而我们在访问一个网站的时候只需输入主机名(有时也指我们所说的域名)即可实现,那是因为我们在背后用到了将主机名解释为了对应的IP地址的机制--DNS.下面我们来介绍DNS的实现过程. 一:bind的安装配置(正反解析): 1.bind 介绍:bind:bekerleyinternet name domain,我们简单的理解它是用bind 工具实 现DNS服务器的配置. 2.bind 安装:bind 安装比较简单我们可以使用下面命令安装并查看安装bind都生成

Team--时代团队第一次迭代分数分配

紧张的第一次迭代落下帷幕,便到了分数分配这样令人揪心又无奈的日子.如何进行分数分配,以使大家都能满意,这一直是个难以非常好地处理的问题.幸运地是,我们团队的所有成员每个人都对本次迭代乃至整个项目过程付出了很多,每个人都尽力地做好自己的事情.这让分数分配的环节显得容易了许多. 最后我们根据上次例会产生的团队个人排名,并按照老师的"各人不同分"的要求,对此次迭代的各人分数进行了分配. 一.本次迭代团队个人排名及工作的简单介绍: 1.李帅. 李帅在本次迭代中主要负责了主要代码编写这一重要又较

在阿里架构师眼中构建一个较为通用的业务技术架构就是如此简单

1.通用架构概述 创业之初,我们往往会为了快速迭代出产品,而选择最简单的技术架构,比如LAMP架构,SSH三层架构.这些架构可以适应初期业务的快速发展,但是,随着业务变得越来越复杂,我们会发现这些架构越来越难支撑业务的发展,出现在一个类中写好几千行代码,一个方法中到处都是if else语句,如果中间遇到主程序猿离职,后面介入的程序猿几乎无法理解这些代码,到最后,产品越来越难迭代,只能推翻重做.如果我们在创业初始就以一种适应性较强的架构去写代码,后面就会少走很多弯路.下面的文章是我自己总结出来的一

在架构师眼中构建一个较为通用的业务技术架构就是如此简单

1.通用架构概述 创业之初,我们往往会为了快速迭代出产品,而选择最简单的技术架构,比如LAMP架构,SSH三层架构.这些架构可以适应初期业务的快速发展,但是,随着业务变得越来越复杂,我们会发现这些架构越来越难支撑业务的发展,出现在一个类中写好几千行代码,一个方法中到处都是if else语句,如果中间遇到主程序猿离职,后面介入的程序猿几乎无法理解这些代码,到最后,产品越来越难迭代,只能推翻重做.如果我们在创业初始就以一种适应性较强的架构去写代码,后面就会少走很多弯路.下面的文章是我自己总结出来的一

不动点迭代算法

今天有个小朋友向我提出了一个「了不起」的问题. 一个有趣的现象 打开一个没有 Bug 的计算器,任意输入一个数值 \(x\),然后找到函数 \(sin(x)\) 或者 \(cos(x)\) ,连续点击这个函数若干次,你会发现一个有趣的现象:无论初始的 \(x\) 为多少,最后的值总是接近某一个数值(这些数值在某个精度范围内是相等的).\(sin(x)\) 最后总为 \(0\) ,\(cos(x)?\) 最后为 0.73 或者 0.99 (取决于你的计算器是否开启弧度制). 从数学的角度来看,实际