这里的迭代器能够与STL组件共同工作,是对STL的一种扩充。

 

自定义迭代器必须提供iterator_traits的五种特性,分别是迭代器类型、元素类型、距离类型、指针类型与reference类型。

 

这里我们继承标准库提供的iterator<>即可。

 

代码如下: MyIterator.hpp 该迭代器针对于关联容器

#ifndef MYITERATOR_H_
#define MYITERATOR_H_ #include <iterator> //必须提供五种类型,作为迭代器traits
template <typename Container>
class MyInsertIterator : public std::iterator<std::output_iterator_tag,
void, void, void, void>
{
public:
explicit MyInsertIterator(Container &c)
:container_(c)
{ } //将赋值转化为insert操作
MyInsertIterator<Container> &operator=(const typename Container::value_type &value)
{
container_.insert(value); //针对的是关联容器
return *this;
} //没有实际动作,起到掩饰的作用
MyInsertIterator<Container> operator*()
{
return *this;
} MyInsertIterator &operator++()
{
return *this;
} MyInsertIterator &operator++(int)
{
return *this;
} protected:
Container &container_;
}; template <typename Container>
MyInsertIterator<Container> MyInsert(Container &c)
{
return MyInsertIterator<Container>(c);
} #endif /* MYITERATOR_H_ */

 

这里面重载的*和++没有实际操作,为的是起到掩饰的作用,从而仅仅返回自身引用。

 

注意=操作符执行了insert操作,所以当我们写下:

 

*iter = 3;

 

时,自动将3插入至容器中。

 

我们还提供了一个MyInsert函数,用于快速生成迭代器对象,于是我们可以这样使用:

MyInsert(coll) = 55;

 

我们只需改动代码中的

container_.insert(value); //针对的是关联容器

如果改为push_back就变成了back_inserter,如果调用push_front则成为front_inserter

 

测试代码如下:

#include "MyIterator.hpp"
#include <set>
#include <string>
#include <iostream>
using namespace std; template <typename CONT>
void print(const CONT &s)
{
for(typename CONT::const_iterator it = s.begin();
it != s.end();
++it)
{
cout << *it << " ";
}
cout << endl;
} int main(int argc, char const *argv[])
{
set<int> coll; MyInsertIterator<set<int> > iter(coll); *iter = 1;
iter++;
*iter = 2;
iter++;
*iter = 3; print(coll); MyInsert(coll) = 44;
MyInsert(coll) = 55; print(coll); int vals[] = {33, 67, -4, 13, 5, 2};
int size = sizeof(vals) / sizeof(vals[0]);
copy(vals, vals + size, MyInsert(coll)); print(coll); return 0;
}

 

结果为:

1 2 3
1 2 3 44 55
-4 1 2 3 5 13 33 44 55 67

扩充STL-编写自己的迭代器的更多相关文章

  1. stl之容器、迭代器、算法几者之间的关系

    转自:https://blog.csdn.net/bobodem/article/details/49386131 stl包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优 ...

  2. SGI STL红黑树中迭代器的边界值分析

    前言 一段程序最容易出错的就是在判断或者是情况分类的边界地方,所以,应该对于许多判断或者是情况分类的边界要格外的注意.下面,就分析下STL中红黑树的迭代器的各种边界情况.(注意:分析中STL使用的版本 ...

  3. STL的erase()陷阱-迭代器失效总结

    下面材料整理自Internet&著作. STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector .deque):另一类是以不连续的节点形式存储的容器(如:list.s ...

  4. STL六大组件之——迭代器这个东西

    迭代器:除了在其它语言中司空见惯的下标法访问容器元素之外,C++语言提供了一种全新的方法——迭代器(iterator)来访问容器的元素.迭代器其实类似于引用,指向容器中某一元素.换个方式来说,容器就是 ...

  5. STL源码剖析 迭代器(iterator)概念与编程技法(三)

    1 STL迭代器原理 1.1  迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...

  6. STL的容器算法迭代器的设计理念

    1) STL的容器通过类模板技术,实现数据类型和容器模型的分离. 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了统一性. 3) STL的函数对象实现了自定义数据类型的算法运算 ...

  7. STL源码剖析(迭代器)

    在STL中,容器跟算法是分开设计的,算法是通过迭代器来对容器进行操作的. 在算法运用迭代器的时候,可能会用到其相应的型别,例如返回值为容器中元素的型别,又或者说根据迭代器的类型来选择更好的算法等等. ...

  8. STL源码剖析--迭代器(转)

    一.为什么需要traits编程技术 前面说了很多关于traits的光荣事迹,但是却一直没有介绍traits究竟是个什么东西,究竟是用来干什么的?traits在英文解释中就是特性,下面将会引入trait ...

  9. 实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中推断不等于end())、operator[])

    遍历一个vector容器有非常多种方法.使用起来也是仁者见仁. 通过索引遍历: for (i = 0; i<v.size(); i++) { cout << v[i] << ...

随机推荐

  1. web页面效果开源框架收集整合

    1.EasyUI:http://www.jeasyui.com/index.php 2.Bootstrap:http://www.bootcss.com/ 3.jqueryui:http://jque ...

  2. Oracle 数据库维护相关

    版本升级 在维护数据库升级的过程中,会产生n个脚本.谈谈我所处的项目背景,项目数据库最早版本假定为1,最后在多次维护后,版本号,可能变更为16.那么针对项目上不同的数据库版本,如何来进行升级呢? 我使 ...

  3. Cow Navigation(USACO)

    题目大意: 给定一个N*N的矩阵,并告诉你每一个格子能否经过,要求你求出(n,1)到(1,n)的最短路径的操作数. 其中操作有2种,第一种是沿着目前的方向走一格,第二种是向左或向右转90° 由于题目设 ...

  4. 小红帽的画笔(NOIP模拟赛Round 7)

    又到了神奇的模拟赛时间~ 真是丧~ 好吧我们来看看题目 小红帽是Pop star上最著名的人类画家,她可以将任何画出的东西变成真实的物品.赋予她这样神奇能力的正是她手上的画笔. 小红帽每次作画时,都需 ...

  5. 算法详解(LCA&RMQ&tarjan)补坑啦!完结撒花(。◕ˇ∀ˇ◕)

    首先,众所周知,求LCA共有3种算法(树剖就不说了,太高级,以后再学..). 1.树上倍增(ST表优化) 2.RMQ&时间戳(ST表优化) 3.tarjan(离线算法)不讲..(后面补坑啦!) ...

  6. 关于boostrapValidator动态添加字段(addField)验证的bug

    每次码博客,都觉得自己怀才不遇,哎~脑袋有瑕疵,文笔拿不粗手,就直接上干货吧. 在使用boostrapValidator这个验证插件的时候,如果某一个字段是动态添加来的,我们需要调用方法:addFie ...

  7. 【linux高级程序设计】(第十四章)TCP高级应用 3

    控制socket文件描述符属性 1.set/getsockopt()修改socket属性 int getsockopt (int __fd, int __level, int __optname, v ...

  8. VS2008中的配置文件app.config简单小结

    应用程序的配置文件用于读取和保存简单的本地数据,vs中新增配置文件可以直接在项目的”属性“-”设置“里添加,添加后在项目的Properties文件夹会多出一组两个文件:Settings.setting ...

  9. 微信小程序实现豆瓣读书

    个人练习项目,使用了scss+webstorm watcher来处理样式.整体上没有什么难点. github:https://github.com/axel10/wx-douban-read

  10. 使用参数化SQL

    Java.C#等语言提供了参数化SQL机制,使用参数化SQL开发人员为在运行时才能确定的参数值设置占位符,在执行的时候再指定这些占位符所代表的值.示例代码如下: string user=txtUser ...