C++ 自定义迭代器(实现++递增两格)
来源:互联网 发布:淘宝客服外包价格 编辑:程序博客网 时间:2024/05/29 16:53
//效果每次迭代器加移动两格
#pragma once//MyIterator.h#include <iterator>#include <exception>template<typename Container>class MyIterator :public std::iterator<std::random_access_iterator_tag, typename Container::value_type>{protected: Container& container; typename Container::iterator pos;public: explicit MyIterator(Container& c) :container(c), pos(c.begin()){} MyIterator(const MyIterator& rhs) :container(rhs.container),pos(rhs.pos) {} MyIterator& operator =(const MyIterator& rhs) { throw_ex(rhs.container); pos = rhs.pos; return *this; } //--等就省略了... MyIterator& operator ++() { auto tmp = container.end() - 1; if (pos == tmp) ++pos; else pos += 2; return *this; } bool operator ==(const MyIterator& rhs)const { try { if (&rhs.container == &container) return pos == rhs.pos; else { throw exception("对象错误"); } } catch (exception &e) { cout << e.what(); exit(EXIT_FAILURE); } }bool operator !=(const MyIterator& rhs)const{ return !(*this == rhs);}typename Container::value_type & operator *(){ return *pos;}void begin(){ pos = container.begin();}void end(){ pos = container.end();}private: void throw_ex(const Container& c) { try { if (&c == &container) return; else throw exception("Copy 构造失败"); } catch (exception &e) { cout << e.what(); exit(EXIT_FAILURE); } }};//无法使用或添加vector<T> vec 成员函数vec.begin()或全局函数begin(vec)//我们做个假冒的全局函数 start(vec) over(vec)template<typename Container>MyIterator<Container> start(Container& c){ MyIterator<Container> mi(c); mi.begin(); return mi;}template<typename Container>MyIterator<Container> over(Container & c){ MyIterator<Container> mi(c); mi.end(); return mi;}
//main.cpp
#include <iostream>#include <vector>#include "MyIterator.h"#include <list>using namespace std;//因继承了iterator<std::random_access_iterator_tag,Container::value_type>才拥有此特性template<typename Iterator>void printIterator(const Iterator &It){ cout << typeid(typename iterator_traits<Iterator>::iterator_category).name() << endl;}int main(){ vector<int> coll{ 1,2,3,4,5,6,7,8,9,10 }; MyIterator<decltype(coll)> myit(coll); printIterator(myit); for (; myit != over(coll); ++myit) { cout << *myit << ends; } system("pause"); return 0;}
效果:
阅读全文
1 0
- C++ 自定义迭代器(实现++递增两格)
- 最长递增子序列(LIS)的两种实现
- Mysql 存储过程--实现两列递增插入
- 自定义Imageview实现图片从左到右递增显示
- mongodb 自定义递增主键
- 自定义View环形递增
- C语言实现文件命名按顺序递增
- 单链表编写递增有序并集(c语言实现)
- 合并两递增链表
- java 两种方式实现自定义排序
- 自定义Dialog的两种实现方式
- 将两个递增的有序链表合并为一个递增的有序链表(C语言编程实现)
- DP两道关于递增非递增的题目
- 两栈共享空间 C语言实现
- c语言实现两种查找
- C语言实现两数交换函数
- C语言实现两数交换函数
- C语言两数实现交换
- 国外某公司前员工删了该公司所有客户数据
- 【Codeforces Round #419 (Div. 1)】Codeforces 815A Karen and Game
- Sublime Text 3下载
- makefile的if语法
- 常用几种窗口状态+常用函数
- C++ 自定义迭代器(实现++递增两格)
- java中验证码程序的实现
- 关于cookie的跨域问题与XSS的原理与防护
- 消消乐(C语言版)
- java杨辉三角的实现
- Makefile中的常用函数
- 【Jetson Tx2 视觉slam开发】入门配置二
- 润乾V5集群缓存同步功能介绍
- 使用java的java 命令,直接调用执行class文件