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相关推荐

  1. 源码之前,了无秘密(一)——iterator adapter

    阅读 iterator adapter 源码,我们将获悉以下结论背后的道理: (1)如何鬼斧神工,将赋值变为插入,将前进变为后退了,绑定到任意装置上 (2)为什么 vector 不支持 front_i ...

  2. iterator adapter reverse_iterator

    1.迭代器适配器reverse_iterator template <class _Iterator> class reverse_iterator { protected:   _Ite ...

  3. 标准模板库(STL)之配接器(Adapter)

    一般只有一个私有成员变量(某物)的类,且其全部的成员函数都是对该唯一的成员变量的存.取和修改(实现修改某物接口,形成另一种风貌,侯捷语),则该类即为对该私有成员变量的配接(adapter). Adap ...

  4. C++ 接配器(Adapter)总结

    近日在看<STL源码解析>,STL里面一大堆泛型编程的确是非常巧妙,不过由于时间有限,我还是只能更加专注于日常使用比较多的一些知识. Adapter是我在最开始使用STL Containe ...

  5. STL源码剖析 配接器

    配接器(adapters)在 STL组件的灵活组合运用功能上,扮演着轴承.转换器的角色.Adapter这个概念,事实上是一种设计模式(design pattern). «Design Patterns ...

  6. STL源码剖析 基本算法 < stl_algobase.h >

    注意事项 : 实际使用的时候,使用的是<algorithm>这个头文件,不是题目中的< stl_algobase.h > equal函数 如果两个序列在[firsLlast) ...

  7. STL——配接器(adapters)

    一.配接器 <Design Patterns>一书提到23个最普及的设计模式,其中对adapter样式的定义如下:将一个class的接口转换为另一个class 的接口,使原本因接口不兼容而 ...

  8. STL - MainTao - 博客园

    STL - MainTao - 博客园 STL Content 简介 容器 迭代器 算法 简介 首先为什么不叫标准库,而叫标准模板库呢?原因在于它突出模板(即泛型)的概念. stl由三部分组成:容器, ...

  9. 【侯捷】C++STL标准库与泛型编程(第三讲)

    第三讲 算法的形式 C++标准库的算法,是什么东西? 说明: 算法Algorithm 是个 function template,标准库中的算法都长成如下这样: template<typename ...

最新文章

  1. 导入eclipse工程到Android Studio中
  2. WinDbg 调试命令记录二 (基础CLR查看)
  3. Java怎么测并发量_如何测试一个web网站的性能(并发数)?
  4. 如何处理JCO版本太旧引起的问题
  5. 日本的电视节目到底能有多特别?
  6. linux文件系统选哪种,linux下几种文件系统的测试比较
  7. Python基础知识汇总
  8. 年审是当月还是当天_汽车年检提前检车的日期是按原始的还是按检车当月的?...
  9. oracle服务器配置及优化
  10. echarts自适应
  11. python变成灰色_Python怎么把彩色图像转换成灰色图像?
  12. VC静态库开发与使用
  13. Elasticsearch镜像打包记录
  14. 按键精灵制作自用游戏脚本所需的简单操作
  15. 微信文章抓取:微信公众号文章抓取常识之临时链接、永久链接
  16. rabbitmq默认guest无法登录的问题解决
  17. 各国海关单证有哪些要求?
  18. Minecraft 1.16.5 生化8 模组 1.8版本 版本同步+支持服务器联机
  19. 使用光泵磁力仪(OPMs)非接触测量视网膜活动
  20. 同步脑电图-功能磁共振融合推断宏观脑动力学

热门文章

  1. 如何快速将文件中的空格更换成逗号(图文详解)
  2. 深入理解JavaScript中的属性和特性
  3. 2015.3.4 VS2005调用MFC dll时报错及解决
  4. LINUX 中htop的安装
  5. Golang 变量申明方式
  6. java基础知识简化
  7. Cassandra 权威指南
  8. golang设置title并获取窗口句柄
  9. Oracle 索引失效的六大限制条件
  10. linux系统磁盘的分配空间不足,Linux系统磁盘空间不足解决办法