iterator adapter inserter
1.insert_iterator
这个adapter将iterator的赋值(assign)操作变为安插(insert操作),并将iterator右移一个位置。如此便可让user连续执行[表面上assign而实际上insert]的行为。
template <class _Container>
class insert_iterator {
protected:
_Container* container ; //底层容器
typename _Container::iterator iter;
public:
typedef _Container container_type;
typedef output_iterator_tag iterator_category; //注意类型
typedef void value_type;
typedef void difference_type;
typedef void pointer;
typedef void reference;
insert_iterator(_Container& __x, typename _Container::iterator __i)
: container (&__x), iter (__i) {}
insert_iterator<_Container>&
operator=(const typename _Container::value_type& __value) {
iter = container-> insert(iter, __value); //关键:转调用insert()
++ iter; //令insert_iterator永远跟随其target贴身移动
return *this;
}
insert_iterator<_Container>& operator*() { return *this; }
insert_iterator<_Container>& operator++() { return *this; }
insert_iterator<_Container>& operator++(int) { return *this; }
};
2.inserter
辅助函式,帮助user使用inserter_iterator
template <class _Container, class _Iterator>
inline
insert_iterator<_Container> inserter(_Container&__x, _Iterator__i)
{
typedef typename _Container::iterator __iter;
return insert_iterator<_Container>(__x, __iter(__i));
}
3.copy
template<class InputIterator,
class OutputIterator>
OutputIterator
copy(InputIterator first,InputIterator last,OutputIterator result)
{
while(first != last) {
*result = *first;
++result ; ++first;
}
return result;
}
4.示例
http://www.cplusplus.com/reference/iterator/inserter/
// inserter example
#include <iostream> // std::cout
#include <iterator> // std::front_inserter
#include <list> // std::list
#include <algorithm> // std::copyint main () {std::list<int> foo,bar;for (int i=1; i<=5; i++){ foo.push_back(i); bar.push_back(i*10); }std::list<int>::iterator it = foo.begin();advance (it,3);std::cout << "foo contains:";for ( std::list<int>::iterator it = foo.begin(); it!= foo.end(); ++it )std::cout << ' ' << *it;std::cout << '\n';std::cout << "bar contains:";for ( std::list<int>::iterator it = bar.begin(); it!= bar.end(); ++it )std::cout << ' ' << *it;std::cout << '\n';std::copy (bar.begin(),bar.end(),std::inserter(foo,it));std::cout << "foo contains:";for ( std::list<int>::iterator it = foo.begin(); it!= foo.end(); ++it )std::cout << ' ' << *it;std::cout << '\n';return 0;
}
执行结果:
iterator adapter inserter相关推荐
- 源码之前,了无秘密(一)——iterator adapter
阅读 iterator adapter 源码,我们将获悉以下结论背后的道理: (1)如何鬼斧神工,将赋值变为插入,将前进变为后退了,绑定到任意装置上 (2)为什么 vector 不支持 front_i ...
- iterator adapter reverse_iterator
1.迭代器适配器reverse_iterator template <class _Iterator> class reverse_iterator { protected: _Ite ...
- 标准模板库(STL)之配接器(Adapter)
一般只有一个私有成员变量(某物)的类,且其全部的成员函数都是对该唯一的成员变量的存.取和修改(实现修改某物接口,形成另一种风貌,侯捷语),则该类即为对该私有成员变量的配接(adapter). Adap ...
- C++ 接配器(Adapter)总结
近日在看<STL源码解析>,STL里面一大堆泛型编程的确是非常巧妙,不过由于时间有限,我还是只能更加专注于日常使用比较多的一些知识. Adapter是我在最开始使用STL Containe ...
- STL源码剖析 配接器
配接器(adapters)在 STL组件的灵活组合运用功能上,扮演着轴承.转换器的角色.Adapter这个概念,事实上是一种设计模式(design pattern). «Design Patterns ...
- STL源码剖析 基本算法 < stl_algobase.h >
注意事项 : 实际使用的时候,使用的是<algorithm>这个头文件,不是题目中的< stl_algobase.h > equal函数 如果两个序列在[firsLlast) ...
- STL——配接器(adapters)
一.配接器 <Design Patterns>一书提到23个最普及的设计模式,其中对adapter样式的定义如下:将一个class的接口转换为另一个class 的接口,使原本因接口不兼容而 ...
- STL - MainTao - 博客园
STL - MainTao - 博客园 STL Content 简介 容器 迭代器 算法 简介 首先为什么不叫标准库,而叫标准模板库呢?原因在于它突出模板(即泛型)的概念. stl由三部分组成:容器, ...
- 【侯捷】C++STL标准库与泛型编程(第三讲)
第三讲 算法的形式 C++标准库的算法,是什么东西? 说明: 算法Algorithm 是个 function template,标准库中的算法都长成如下这样: template<typename ...
最新文章
- 导入eclipse工程到Android Studio中
- WinDbg 调试命令记录二 (基础CLR查看)
- Java怎么测并发量_如何测试一个web网站的性能(并发数)?
- 如何处理JCO版本太旧引起的问题
- 日本的电视节目到底能有多特别?
- linux文件系统选哪种,linux下几种文件系统的测试比较
- Python基础知识汇总
- 年审是当月还是当天_汽车年检提前检车的日期是按原始的还是按检车当月的?...
- oracle服务器配置及优化
- echarts自适应
- python变成灰色_Python怎么把彩色图像转换成灰色图像?
- VC静态库开发与使用
- Elasticsearch镜像打包记录
- 按键精灵制作自用游戏脚本所需的简单操作
- 微信文章抓取:微信公众号文章抓取常识之临时链接、永久链接
- rabbitmq默认guest无法登录的问题解决
- 各国海关单证有哪些要求?
- Minecraft 1.16.5 生化8 模组 1.8版本 版本同步+支持服务器联机
- 使用光泵磁力仪(OPMs)非接触测量视网膜活动
- 同步脑电图-功能磁共振融合推断宏观脑动力学