C++自定义迭代器模板,实现ArrayList基本操作,自定义迭代器遍历
运用到的知识:(不分先后)
模板,类,循环数组,线性表,指针,异常,迭代器,输入输出等C++基础
#include<iterator>
#include<iostream>
#include<vector>
#include<cstring>
#include<string>
using namespace std;class EmptyListException :public exception
{
public:EmptyListException(){}
};
class InvalidIteratorException :public exception
{
public:InvalidIteratorException(){}
};template<class T>
class ArrayList {public:class Iterator : public iterator <input_iterator_tag, T> {public:Iterator(T* p,T* elem,int cnt) {_ptr = p;selfElems = elem;count = cnt;}bool operator != (const Iterator &iter) {return _ptr!= iter._ptr;}bool operator == (const Iterator &iter) {return _ptr == iter._ptr;}Iterator& operator ++ () {_ptr++;if(_ptr >= selfElems+count) _ptr = selfElems;return *this;}Iterator& operator -- () {_ptr--;if(_ptr < 0) _ptr = selfElems+count-1;return *this;}Iterator operator ++ (int) {Iterator tmp= *this;_ptr++;if(_ptr >= selfElems+count) _ptr = selfElems;return tmp;}Iterator operator -- (int) {Iterator tmp= *this;_ptr--;if(_ptr < 0) _ptr = selfElems+count-1;return tmp;}T& operator * () {return *_ptr;}public:T* _ptr;T* selfElems;int count;};ArrayList() {_selfElems = new T[4];_count = 4;init();}ArrayList(int n) {_selfElems = new T[n];_count = n;init();}~ArrayList() {delete[] _selfElems;}void init() {_front=0;_back=-1;nowsize = 0;}T& operator[](int i) {return _selfElems[i];}Iterator begin() {return Iterator(_selfElems+_front,_selfElems,_count);}Iterator end() {return Iterator(_selfElems + (_back + 1)%_count,_selfElems,_count);}T& front() {return _selfElems[_front];}T& back() {return _selfElems[_back];}int size() const {return nowsize;}void insertFront(T& e) {if(nowsize == _count) {T* _selfElems2 = new T[_count*2];for(int i = 0; i<_count; i++) {_selfElems2[i] = _selfElems[(_front+i)%_count];}delete[] _selfElems;_selfElems = _selfElems2;_front=0;_back=_count-1;_count*=2;}if(_front == 0) _front=_count-1;else _front--;_selfElems[_front] = e;nowsize++;}void insertBack(T&e) {if(nowsize == _count) {T* _selfElems2 = new T[_count*2];for(int i = 0; i<_count; i++) {_selfElems2[i] = _selfElems[(_front+i)%_count];}delete[] _selfElems;_selfElems = _selfElems2;_front=0;_back=_count-1;_count*=2;}_back = (_back+1) % _count;_selfElems[_back] = e;nowsize++;}void insert(Iterator p, T& e) {if(p._ptr < _selfElems || p._ptr >= _selfElems+_count||(begin()._ptr < end()._ptr && (p._ptr < begin()._ptr || p._ptr >= end()._ptr)) || (begin()._ptr > end()._ptr && (p._ptr < begin()._ptr && p._ptr >= end()._ptr))) {throw InvalidIteratorException();}if(nowsize == _count) {T* _selfElems2 = new T[_count*2];for(int i = 0; i<_count; i++) {_selfElems2[i] = _selfElems[(_front+i)%_count];}delete[] _selfElems;_selfElems = _selfElems2;_front=0;_back=_count-1;_count*=2;}int pos = p._ptr - begin().ptr;int len = (_back-1)-(pos+_front);for(int i = len; i>=0; i++) {int tar = i + pos+_front;_selfElems[(tar+1)%_count] = _selfElems[tar%_count];}_selfElems[pos+_front] = e;nowsize++;}void removeFront() {if(nowsize == 0) {throw EmptyListException();}_front = (_front+1)%_count;nowsize--;}void removeBack() {if(nowsize == 0) {throw EmptyListException();}_back = (_back+_count-1)%_count;nowsize--;}void remove(Iterator p) {if(nowsize == 0) {throw EmptyListException();}if(p._ptr < _selfElems || p._ptr >= _selfElems+_count||(begin()._ptr < end()._ptr && (p._ptr < begin()._ptr || p._ptr >= end()._ptr)) || (begin()._ptr > end()._ptr && (p._ptr < begin()._ptr && p._ptr >= end()._ptr))) {throw InvalidIteratorException();}int pos = p._ptr - begin()._ptr;//pos+_front ~ (back-1)int len = (_back-1)-(pos+_front);for(int i = 0; i<len; i++) {int tar = i + pos+_front;_selfElems[tar%_count] = _selfElems[(tar+1)%_count];}nowsize--;}private:int _count;int _front,_back,nowsize;T* _selfElems;};void testArrayListUnderflow() {// the first try blocktry {ArrayList<int> arr;int x = 1;arr.insertBack(x);arr.removeFront();arr.removeFront();printf("did not catch exception\n");} catch(EmptyListException& e) {printf("caught EmptyStackException\n");}// the second try blocktry {ArrayList<int> arr;int x = 1;arr.insertBack(x);arr.removeBack() ;arr.removeBack() ;printf("did not catch exception\n");} catch(EmptyListException& e) {printf("caught EmptyStackException\n");}// the third try blocktry {ArrayList<int> arr;int x = 1;arr.insertBack(x);ArrayList<int>::Iterator it = arr.begin();arr.remove(it);it = arr.begin();arr.remove(it);printf("did not catch exception\n");} catch(EmptyListException& e) {printf("caught EmptyStackException\n");}
}
void testIntegerIterator() {ArrayList<int> arr;int a[6] = {1,2,3,4,5,6};for(int i = 0; i<6; i++) arr.insertBack(a[i]);for(ArrayList<int>::Iterator iter = arr.begin(); iter != arr.end(); iter++) {cout << *iter << " ";}cout << endl;arr.removeFront();arr.removeFront();arr.removeFront();int b[3] = {7,8,9};arr.insertBack(b[0]);arr.insertBack(b[1]);arr.insertBack(b[2]);for(ArrayList<int>::Iterator iter = arr.begin(); iter != arr.end(); iter++) {cout << *iter << " ";}cout << endl;
}
void testStringIterator() {ArrayList<string> arr;string a[6] = {"s1","s2","s3","s4","s5","s6"};for(int i = 0; i<6; i++) arr.insertBack(a[i]);for(ArrayList<string>::Iterator iter = arr.begin(); iter != arr.end(); iter++) {cout << *iter << " ";}cout << endl;arr.removeFront();arr.removeFront();arr.removeFront();string b[3] = {"s7","s8","s9"};arr.insertBack(b[0]);arr.insertBack(b[1]);arr.insertBack(b[2]);for(ArrayList<string>::Iterator iter = arr.begin(); iter != arr.end(); iter++) {cout << *iter << " ";}cout << endl;
}
int main() {testArrayListUnderflow();testIntegerIterator();testStringIterator();return 0;
}
参考资料:
http://c.biancheng.net/view/471.html
https://blog.csdn.net/holyweng/article/details/82821646
https://blog.csdn.net/qq_36745117/article/details/83863190
https://blog.csdn.net/XiaoHeiBlack/article/details/77014626
C++自定义迭代器模板,实现ArrayList基本操作,自定义迭代器遍历相关推荐
- html 自定义打印模板,HTML+CSS入门 自定义模板详解
本篇教程介绍了HTML+CSS入门 自定义模板详解,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门.< 首先总的stylecss和大模板都是当初angel_Kitty学姐的,嗯, ...
- 拖拽元素自定义html模板,JS实现的自定义网页拖动类
本文实例讲述了JS实现的自定义网页拖动类.分享给大家供大家参考,具体如下: 先来看运行效果截图如下: 在线演示地址如下: 具体代码如下: /p> "http://www.w3.org/ ...
- php 自定义打印模板下载,PHP – 创建自定义模板系统?
我已经在这里搜索过,令人惊讶的是我找不到答案.我发现了一个类似的线程,但没有真正的解决方案.复杂的部分是循环,如果我不需要循环我可以只是做一个常规替换. 所以,我有一个带有一些标记的.html文件,如 ...
- ArrayList存储自定义对象并遍历三种方式(迭代器 普通for 增强for)
import java.util.ArrayList; import java.util.Iterator;/** ArrayList存储自定义对象并遍历* A:迭代器* B:普通for* C:增强f ...
- 6、jeecg 笔记之 自定义excel 模板导出(一)
6.jeecg 笔记之 自定义excel 模板导出(一) 1.前言 jeecg 中已经自带 excel 的导出导出功能,其所使用的是 easypoi,尽管所导出的 excel 能满足大部分需求, 但总 ...
- android 自定义模板下载,android studio 自定义模板
由于项目用上了 mvp 架构,基本上一个页面就至少需要新创建6个类,分别是 model view presenter 的接口以及其对应的实现类,再加上使用 dagger 的话就要更多了,所以这时候 a ...
- TFS2008自定义过程模板之 Power Tools 工具篇
上午写了一篇关于自定义过程模板的文章http://www.cnblogs.com/sansi/archive/2010/03/11/1683355.html,是手工直接处理xml文件.刚刚发现原来是有 ...
- VSCode 自定义html5模板
新建html快捷键 当我们想在VSCode中新建html代码时,可以 输入! 然后回车或者Tab即可自动生成一个html文件模板,效果如下: (二)自定义html5模板 但我们每次新建html模板时候 ...
- 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器
1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...
- MyEclipse自定义servlet模板
每次用MyEclipse默认的servlet的模板创建servlet的时候,里面会生成好多没有用的代码.因此,我们可以自定义servlet模板.步骤如下: 找到com.genuitec.eclipse ...
最新文章
- windows 7 unmountable boot volume 解决方法
- Oracle的LINUX安装
- arm-linux-g 找不到头文件,交叉编译错误“ arm-none-eabi-g ++找不到条目符号”
- 1.6 Java数组也是一种数据类型
- 【转载】十年学会编程
- 微机原理换行代码_设置段落样式的标记中,用来换行的标记是:
- 驳斥5条普通流Tropes
- Java相当好的隐私(PGP)
- Windows五种IO模型性能分析和Linux五种IO模型性能分析
- pynput模块—键盘鼠标操作和监听
- Atitit 图像指纹识别匹配sift算法 atlks总结
- 苹果怎么改字体_截图里的文字要改,字体怎么做到一模一样?
- android实现按键找图功能,从零学起之安卓篇《按键精灵安卓版找图找色应用汇总介绍》更新20140603 _ 教程中心 - 按键精灵论坛...
- html关于点击radio触发事件
- Word、Excel操作技巧大全
- python怎么算积分_Python求解数值积分-定积分求解
- Java 程序员们值得一看的好书推荐
- 神经网络预测结果分析,神经网络怎么预测数据
- 怀揣巨资等了一季 陈天桥距门户野心咫尺之遥
- 计算机网络之网络层7
热门文章
- 同步,异步,多线程,你怎么看?
- JS 获取当前日期时间(兼容IE FF)
- [Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]
- 可信计算 沈昌祥_沈昌祥院士:用主动免疫可信计算构筑车联网安全防线
- 街上第一台电子计算机是,南京信息工程大学滨江学院2009级《计算机基础》(文科)a试卷(含答案)【最新】.doc...
- 12c表空间不存在_一文看懂Oracle查询表空间的每日增长量和历史情况统计
- c语言solaris中图形库,成功弄出simics下的CDE登录界面,与大家分享
- WinCE流设备驱动简介及GPIO驱动的实现
- java的未检查异常有哪些_Java:检查异常与未检查异常
- 无法定位程序输入点 except_软件测试中的功能测试点(三)