迭代器适配器(二)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 Container::iterator iterator; InsertIterator(Container &cont, iterator iter) :cont_(cont), iter_(iter) { } InsertIterator<Container> &operator=(const value_type &val)
{
cont_.insert(iter_, val);
++iter_;
return *this;
} InsertIterator<Container> &operator*()
{
return *this;
} InsertIterator<Container> &operator++()
{
return *this;
}
InsertIterator<Container> &operator++(int)
{
return *this;
} private:
Container &cont_;
iterator iter_;
}; template <typename Container>
InsertIterator<Container> inserter(Container &c)
{
return InsertIterator<Container>(c);
} #endif //ITERATOR_HPP
可以看出,赋值操作使得内部存储的迭代器前移,而++操作同样什么都没有做。
或许我们想:可不可以在赋值操作符中不改变迭代器,而是到了++中改变?
答案是否定的。
设想,按照刚才设想的去实现,那么如果用户做了以下操作:
iter++;
iter++;
iter++;
*iter = ;
那么我们没法保证最后一行时,iter指向的位置是可以插入元素的。
那么上面的写法为什么可行?原因是执行insert操作时,有个特殊位置为end(),它指向最后一个元素的下一个位置,也就是第一个非法的位置。这也是唯一一个合法的非法位置。
按照上面源码的实现,仅仅在赋值时迭代器前移,iter++无实质操作,而赋值时前移,iter实际指向了新的end()位置,就保证了无论用户怎么执行++操作,都丝毫不会影响iter的有效性。
测试代码如下:
#include "Iterator.hpp"
#include <iostream>
#include <string>
#include <vector>
using namespace std; template <typename T>
void printElems(const T &t, const string &s = "")
{
cout << s << " ";
for(typename T::const_iterator it = t.begin();
it != t.end();
++it)
{
cout << *it << " ";
}
cout << endl;
} int main(int argc, char const *argv[])
{
vector<int> coll;
coll.push_back();
coll.push_back();
coll.push_back();
printElems(coll); inserter(coll, coll.begin()) = ;
inserter(coll, coll.begin()) = ; printElems(coll); inserter(coll, coll.end()) = ;
inserter(coll, coll.end()) = ; printElems(coll); return ;
}
迭代器适配器(二)general inserter的实现的更多相关文章
- 【C++ STL应用与实现】18: 怎样使用迭代器适配器
本系列文章的文件夹在这里:文件夹. 通过文件夹里能够对STL整体有个大概了解 前言 本文介绍了STL中的迭代器适配器(iterator adapter)的概念及其用法演示样例.迭代器适配器能够和标准库 ...
- function adapter(函数适配器)和迭代器适配器
所谓function adapter(函数适配器)是指能够将不同的函数对象(或是和某值或某寻常函数)结合起来的东西,它自身也是个函数对象. 迭代器适配器 运用STL中的迭代器适配器,可以使得算法能够 ...
- STL标准库-迭代器适配器
技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 这次主要介绍一下迭代器适配器.以reverse_iterator(反向迭代器),insert_iterator(插入迭代器),o ...
- 迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}
一.迭代器适配器 反向迭代器 插入迭代器 IO流迭代器 其中反向迭代器可以参考以前的文章. 二.插入迭代器 插入迭代器实际上是一个输出迭代器(*it=; ++) back_insert_iterato ...
- STL 迭代器适配器(iterator adapter)
iterator adapter graph LR iterator --- reverse_iterator iterator --- Insert_iterator iterator --- io ...
- 迭代器适配器(一)back_inserter和front_inserter的实现
本文讨论back_inserter和front_inserter的实现. 当我们调用copy函数的时候,要确保目标容器具有足够大的空间,例如: //将other的所有元素拷贝到以coll.begin( ...
- C++ vector迭代器访问二维数组
#include<iostream> #include<vector> int main(){ std::vector<int> arr(); // 创建一维数组 ...
- python 迭代器(二):迭代器基础(二)可迭代的对象与迭代器的对比
可迭代的对象 如果对象实现了能返回迭代器的 __iter__ 方法,那么对象就是可迭代的. 序列都可以迭代:实现了 __getitem__ 方法,而且其参数是从零开始的索引,这种对象也可以迭代. &g ...
- C++标准库分析总结(八)——<仿函数、适配器、istream_iterator、ostream_iterator、bind>
一.仿函数定义 仿函数是STL中最简单的部分,存在的本质就是为STL算法部分服务的,一般不单独使用.仿函数(functors)又称为函数对象(function objects),虽然函数指针虽然也可以 ...
随机推荐
- Topcoder SRM 603 div1题解
昨天刚打了一场codeforces...困死了...不过赶在睡前终于做完了- 话说这好像是我第一次做250-500-1000的标配耶--- Easy(250pts): 题目大意:有一棵树,一共n个节点 ...
- memcached 实现读锁
memcached锁,网上大多就介绍乐观锁(cas)[1.2.4以上版本,telnet连接上memcache使用status可以查看版本号].核心就是每次写入数据的时候使用 cas($cas_toke ...
- vue实现tab切换
需要弄类似tab切换的功能就是一个点击切换上一页下一页的页面 找到这个获得灵感 <!DOCTYPE html> <html lang="en"> <h ...
- TemplateBinding和Binding
TemplateBinding是Binding的一个轻量级版本,它失去了成熟版本Binding的很多功能,比如继承内容引用(inheritence context referencing),Relat ...
- ScrollLayer
http://www.oschina.net/p/scrolllayer ScrollLayer 编辑/纠错 分享到: 已用 +1 收藏 +12 4月18日 武汉 源创会开始报名,送华为开 ...
- awk 二
节详细介绍awk内置函数,主要分以下3种类似:算数函数.字符串函数.其它一般函数.时间函数 一.算术函数: 以下算术函数执行与 C 语言中名称相同的子例程相同的操作: 函数名 说明 atan2( y, ...
- centos6源码编译安装lnmp环境
操作系统 版本 64位 CentOS-6.6 10.0.0.20 安装环境所需依赖包 yum -y install gcc automake autoconf libtool make gcc- ...
- Codeforces 897 A.Scarborough Fair-字符替换
A. Scarborough Fair time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Doki Doki Literature Club
Doki Doki Literature Club! is a visual novel developed by Team Salvato. The protagonist is invited b ...
- Python Unittest与数据驱动
python中有一个装饰器类DDT,通过它我们可以复用代码,达到数据驱动测试的目的,该类的官方介绍可以参考 http://ddt.readthedocs.io/en/latest/index.html ...