迭代器适配器(二) general inserter的简单实现

general inserter允许用户在指定位置插入。

实现代码如下:

 1 #ifndef ITERATOR_H
 2 #define ITERATOR_H
 3 #include <iterator>
 4
 5 //BackInsertIterator
 6 template <typename Container>
 7 class InsertIterator
 8 {
 9 public:
10     typedef typename Container::value_type value_type;
11     typedef typename Container::iterator   iterator;
12
13     explicit InsertIterator(Container &cont, iterator iter)
14         :_cont(cont), _iter(iter)
15     { }
16
17     InsertIterator<Container> &operator= (const value_type &val)
18     {
19         _cont.insert(_iter, val);
20         ++ _iter;
21         return *this;
22     }
23
24     InsertIterator<Container> &operator*()
25     { return *this; }
26
27     InsertIterator<Container> &operator++()
28     { return *this; }
29
30     InsertIterator<Container> &operator++(int)
31     { return *this; }
32 private:
33     Container &_cont;
34     iterator _iter;
35 };
36
37 template <typename Container>
38 InsertIterator<Container> inserter(Container &c)
39 { return InsertIterator<Container>(c); }
40
41
42
43 #endif

可以看出,赋值操作使得内部存储的迭代器前移,而++操作同样什么都没有做。

注意: 不在赋值操作符中改变迭代器,而到++操作中改变————这种做法是不行的。

执行insert操作时,有个特殊位置为end(),它指向最后一个元素的下一个位置,也就是第一个非法的位置。这也是唯一一个合法的非法位置

按照上面源码的实现,仅仅在赋值时迭代器前移,iter++无实质操作,而赋值时前移,iter实际指向了新的end()位置,就保证了无论用户怎么执行++操作,都丝毫不会影响iter的有效性

测试代码如下:

 1 #include "inser.hpp"
 2 #include <iostream>
 3 #include <string>
 4 #include <vector>
 5 using namespace std;
 6
 7 template <typename T>
 8 void printElems(const T &t, const string &s = "")
 9 {
10     cout << s << " ";
11     for(typename T::const_iterator it = t.begin();
12         it != t.end();
13         ++it)
14     {
15         cout << *it << " ";
16     }
17     cout << endl;
18 }
19
20 int main(int argc, char const *argv[])
21 {
22     vector<int> coll;
23     coll.push_back(12);
24     coll.push_back(34);
25     coll.push_back(32);
26     printElems(coll);
27
28
29     inserter(coll, coll.begin()) = 99;
30     inserter(coll, coll.begin()) = 88;
31
32     printElems(coll);
33
34     inserter(coll, coll.end()) = 34;
35     inserter(coll, coll.end()) = 21;
36
37     printElems(coll);
38
39     return 0;
40 }

测试结果为:

 12 34 32
 88 99 12 34 32
 88 99 12 34 32 34 21 
时间: 2024-11-06 15:58:08

迭代器适配器(二) general inserter的简单实现的相关文章

C++ Primer 学习笔记_54_STL剖析(九):迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_i

回顾 适配器 1.三种类型的适配器: (1)容器适配器:用来扩展7种基本容器,利用基本容器扩展形成了栈.队列和优先级队列 (2)迭代器适配器:(反向迭代器.插入迭代器.IO流迭代器) (3)函数适配器:函数适配器能够将仿函数和另一个仿函数(或某个值.或某个一般函数)结合起来. [1]针对成员函数的函数适配器 [2]针对一般函数的函数适配器 一.迭代器适配器 1.反向迭代器 2.插入迭代器 3.IO流迭代器 其中反向迭代器,利用正向迭代器实现可以参考以前<46_STL剖析(三)>. 二.插入迭代

几个数据库的小案例(二):极其简单的省市联动

总用有两个文件(frmMain.cs SqlHelper.cs) //frmMain.cs//作者:Meusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 省市联动

人工智能初体验(二):开发简单的图灵智能聊天工具

前言:这里为了有更好的个性化设置,因此我选择了图灵机器人(http://www.tuling123.com/)的接口,使用方法跟上一篇中使用百度的接口是差不多的. 注:文末有打包好的小软件和完整源代码的下载链接 一 API Key申请 申请地址:http://www.tuling123.com/ 中间的注册登录过程不说,最后把API Key值记录下来 二 核心功能开发 这个小项目的目录结构: 核心功能文件TuringRobot.java,代码很简单,一看就明白,代码如下: package act

python网络爬虫入门(二)——用python简单实现调用谷歌翻译

最近在看国外的文档,有些生词不认识.就用谷歌翻译来理解,用着用着闲来无事就按F12查看了下页面的源代码.发现可以用python简单的实现下谷歌翻译的页面功能.于是先上网搜下有没有类似的文章博客,发现几篇不错的,于是参考其他代码与自己的思路,简单的实现了下翻译的功能,代码如下: import re import urllib,urllib2 #----------模拟浏览器的行为,向谷歌翻译发送数据,然后抓取翻译结果,这就是大概的思路------- def Gtranslate(text): #t

排序(二)__冒泡排序、简单选择排序和直接插入排序

前面<排序(一)__综述>提到按照算法的复杂度分为简单算法和改进算法两大类,本文主要就简单算法中的冒泡排序.简单选择排序和直接插入排序进行通俗详细的解析. 一.冒泡排序 1.基本概念 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止.(动态图来自维基百科) 2.关键代码(优化之后) void BubbleSort(SqList *L) { int i,j; Status flag=TRUE;            //flag用作标记,避

IOS 之 PJSIP 笔记(二) iPJSUA 的简单使用

上一篇在编译完之后,就很不负责的结束了,本篇就对 PJSIP 库中提供的一个示例 iPJSUA 的使用,做一个简单的介绍.也能解除很多人对官方文档的一个困扰,起码我是被困扰过了. 首先,要确保你的 PJSIP 的库和你即将要编译的平台对应,或者你直接使用上一篇博文最后链接下载的库,那样不用做任何配置,因为它相应的 lib 文件夹中的库,都是支持多平台的. 打开位于:pjsip-apps/src/pjsua/ios/ 下的 ipjsua.xcodeproj ,command + r ,运行该项目,

TensorflowTutorial_二维数据构造简单CNN

使用二维数据构造简单卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 图像和一些时序数据集都可以用二维数据的形式表现,我们此次使用随机分布的二位数据构造一个简单的CNN-网络卷积-最大池化-全连接 参考代码 # Implementing Different Layers # --------------------------------------- # # We will illustrate how to use different types # of layers

迭代器适配器(二)general inserter的实现

上节我们实现了back_inserter和front_inserter,接下来是更为普通的插入迭代器,它允许用户指定插入位置. 实现代码如下: #ifndef ITERATOR_HPP #define ITERATOR_HPP template <typename Container> class InsertIterator { public: typedef typename Container::value_type value_type; typedef typename Contai

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 插入迭代器:将一般迭代器的赋值