扩充STL-编写自己的迭代器
2015-03-19 00:00
316 查看
这里的迭代器能够与STL组件共同工作,是对STL的一种扩充。
自定义迭代器必须提供iterator_traits的五种特性,分别是迭代器类型、元素类型、距离类型、指针类型与reference类型。
这里我们继承标准库提供的iterator<>即可。
代码如下: MyIterator.hpp 该迭代器针对于关联容器
这里面重载的*和++没有实际操作,为的是起到掩饰的作用,从而仅仅返回自身引用。
注意=操作符执行了insert操作,所以当我们写下:
时,自动将3插入至容器中。
我们还提供了一个MyInsert函数,用于快速生成迭代器对象,于是我们可以这样使用:
我们只需改动代码中的
如果改为push_back就变成了back_inserter,如果调用push_front则成为front_inserter
测试代码如下:
结果为:
自定义迭代器必须提供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-编写自己的迭代器
- c++中STL怎样编写自己的函数对象
- 自己实现 STL 迭代器
- 自己对“用不同颜色显示表格奇偶行的例子”扩充了用不同颜色显示鼠标单击的行
- 如何给自己编写的程序隐蔽的设置开机启动
- STL 源码剖析读书笔记二:迭代器与traits
- 编写自己的shell解析器(一)一个简单的循环命令输入和历史打印
- VC编写自己构造http协议数据的post上传图片类(MFC环境 带编码转换)(转)
- Calendar自己编写日历控件 并且能编写自己日程。
- 编写和提交自己的第一个内核patch
- STL利用输入迭代器读入文本文件中的数据
- C# 通过接口IEnumerator让自己编写的对象/类,实现foreach遍历方法
- apiexample.c例子教我们如何利用FFMPEG库中的API函数来编写自己的编解码程序
- 自己写的三叉归并排序(比STL::sort快一点点)
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- 从零开始学C++之STL(十):迭代器适配器{(插入迭代器back_insert_iterator)、IO流迭代器(istream_iterator、ostream_iterator)}
- [置顶]cocos2d-x 中文显示问题的解决方案 (自己封装一个类一次编写终身无忧)
- 如何将自己编写的软件放在真机上运行
- QT 使用总结 -----/* 自己编写 */
- STL的迭代器--Iterator