当前位置: 首页 > news >正文

List迭代器和模拟(迭代器的模拟)

单向、双向、随机迭代器

算法对迭代器是有要求的,算法迭代器名字就是要求。

迭代器通用的功能++/*(解引用)/!=这几个基本组成。

需要单向迭代器的算法,则在这个算法加入的迭代器就必须是大于单向迭代器的功能的(也就是说后面的迭代器都支持前面迭代器的功能,这里体现了向前兼容特点,也更好的解偶)如果是数据结构stl迭代器是双向迭代器是实现不了随机的功能的,这也导致了有时候使用迭代器时候用不了+  -迭代,这就是因为双向迭代器不支持+,-这些运算符重载。双向迭代器不能支持+-操作,一般能实现的只有随机迭代器(解决办法就是在调用之前使用一个变量存储迭代器然后++\--操作达到想要的指向地址) 

list内部的sort算法,如果数据量小,就用,数据量大,用别人的。因为算法库里面的sort是随机迭代器,比list大,所以有些操作不能支持,所以这里需要写sort调用list自己的sort。

list的模拟

结点

双向链表的结点和我们在数据结构中双向链表是一样的。

	//链表结点template<class T>class list_node{T data;			//数据内容list_node* next;//指向下一个结点list_node* prev;//指向上一个结点//构造list_node(const T& value):data(value),next(nullptr),prev(nullptr){}};

迭代器

	//迭代器template<class T,class Ref,class Ptr>struct __list_iterator{typedef list_node<T> Node;typedef __list_iterator<T, Ref, Ptr> Self;Node* _pNode;//构造__list_iterator(Node* pNode = nullptr):_pNode(pNode){}//*解引用访问数据Ref operator*()//使用引用是为了方便修改数据{return _pNode->_data;}//->运算符重载Ptr operator->(){return &(_pNode->_data);}//++运算符重载Self& operator++(){_pNode = _pNode->_next;return *this;}//后置++Self operator++(int){Self tmp(*this);_pNode = _pNode->_next;return tmp;}//--运算符重载Self& operator--(){_pNode = _pNode->_prev;return *this;}//后置--Self operator--(int){Self tmp(*this);//拷贝值(浅拷贝)_pNode = _pNode->_prev;return tmp;}//!=运算符重载bool operator!=(const Self& l)const{return _pNode == l._pNode;}//==运算符重载bool operator == (const Self& l)const{return _pNode == l._pNode;}};

插入

		iterator insert(iterator pos, const T& value){Node* newnode = new Node(value);Node* cur = pos._pNode;Node* prev = pos._pNode->_prev;//newnodenewnode->_next = cur;newnode->_prev = prev;//prev curprev->_next = newnode;cur->_prev = newnode;++_size;return newnode;}

删除

		//删除iterator erase(iterator pos){Node* next = pos._pNode->_next;Node* prev = pos._pNode->_prev;prev->_next = next;next->_prev = prev;delete pos._pNode;pos._pNode = nullptr;--_size;return next;}

empty

		//emptybool empty(){return _size == 0;}

size

		//sizesize_t size(){return _size;}

获取头部元素

		//获取首元素T& front()const{return _head->_next->_data;}

获取尾部元素

		//获取尾部元素T& back()const{return _head->_prev->_data;}

尾插尾删

		//尾插void push_back(const T& value){insert(end(), value);//这里不用前置--,insert在设计的时候就是在pos位置之前插入}//尾删void pop_back(){erase(--end());}

这里为了避免大家翻上面代码,我这里把insert和erase的代码放在下面

insert

		//插入iterator insert(iterator pos, const T& value){Node* newnode = new Node(value);Node* cur = pos._pNode;Node* prev = pos._pNode->_prev;//newnodenewnode->_next = cur;newnode->_prev = prev;//prev curprev->_next = newnode;cur->_prev = newnode;++_size;return newnode;}

erase

		//删除iterator erase(iterator pos){Node* next = pos._pNode->_next;Node* prev = pos._pNode->_prev;prev->_next = next;next->_prev = prev;delete pos._pNode;pos._pNode = nullptr;--_size;return next;}

头插头删

		//头插void push_front(const T& value){insert(begin(), value);}//头删void pop_front(){erase(begin());}

clear

		//clearvoid clear(){iterator it = begin();while (it != end()){it = erase(it);}}

swap

		//swapvoid swap(list<T>& l){std::swap(_head, l._head);std::swap(_size, l._size);}

拷贝

		//拷贝list(const list<T>& l){_head = new Node;_head->_next = _head;_head->_prev = _head;for (auto& e : l){push_back(e);}}

赋值

		//赋值list<T>& operator=(const list<T>& l){//_head = l._head;//_size = l._size;//return *this;if(this != &l){clear();list<T> tmp(l);swap(tmp);}return *this;}

完整代码

#pragma once
#include<iostream>using namespace std;namespace bear
{//链表结点template<class T>struct list_node{T _data;			//数据内容list_node<T>* _next;//指向下一个结点list_node<T>* _prev;//指向上一个结点//构造list_node(const T& value = T()):_data(value),_next(nullptr),_prev(nullptr){}};//迭代器template<class T,class Ref,class Ptr>struct __list_iterator{typedef list_node<T> Node;typedef __list_iterator<T, Ref, Ptr> Self;Node* _pNode;//构造__list_iterator(Node* pNode):_pNode(pNode){}//*解引用访问数据Ref operator*()//使用引用是为了方便修改数据{return _pNode->_data;}//->运算符重载Ptr operator->(){return &(_pNode->_data);}//++运算符重载Self& operator++(){_pNode = _pNode->_next;return *this;}//后置++Self operator++(int){Self tmp(*this);_pNode = _pNode->_next;return tmp;}//--运算符重载Self& operator--(){_pNode = _pNode->_prev;return *this;}//后置--Self operator--(int){Self tmp(*this);//拷贝值(浅拷贝)_pNode = _pNode->_prev;return tmp;}//!=运算符重载bool operator!=(const Self& l)const{return _pNode != l._pNode;}//==运算符重载bool operator == (const Self& l)const{return _pNode == l._pNode;}};template<class T>class list{public:typedef list_node<T> Node;typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;//迭代器iterator begin(){return iterator(_head->_next);}iterator end(){return iterator(_head);}const_iterator begin()const{return const_iterator(_head->_next);}const_iterator end()const{return const_iterator(_head);}//构造list(){_head = new Node;_head->_next = _head;_head->_prev = _head;}//拷贝list(const list<T>& l){_head = new Node;_head->_next = _head;_head->_prev = _head;for (auto& e : l){push_back(e);}}//赋值list<T>& operator=(const list<T>& l){//_head = l._head;//_size = l._size;//return *this;if(this != &l){clear();list<T> tmp(l);swap(tmp);}return *this;}//析构~list(){clear();delete _head;_head = nullptr;}//插入iterator insert(iterator pos, const T& value){Node* newnode = new Node(value);Node* cur = pos._pNode;Node* prev = pos._pNode->_prev;//newnodenewnode->_next = cur;newnode->_prev = prev;//prev curprev->_next = newnode;cur->_prev = newnode;++_size;return newnode;}//删除iterator erase(iterator pos){Node* next = pos._pNode->_next;Node* prev = pos._pNode->_prev;prev->_next = next;next->_prev = prev;delete pos._pNode;pos._pNode = nullptr;--_size;return next;}//emptybool empty()const{return _size == 0;}//sizesize_t size()const{return _size;}//获取首元素T& front()const{return _head->_next->_data;}//获取尾部元素T& back()const{return _head->_prev->_data;}//尾插void push_back(const T& value){insert(end(), value);}//尾删void pop_back(){erase(--end());}//头插void push_front(const T& value){insert(begin(), value);}//头删void pop_front(){erase(begin());}//clearvoid clear(){iterator it = begin();while (it != end()){it = erase(it);}}//swapvoid swap(list<T>& l){std::swap(_head, l._head);std::swap(_size, l._size);}private:Node* _head;size_t _size = 0;};
}

http://www.dtcms.com/a/435622.html

相关文章:

  • 安卓手机做网站服务器全国十大软件开发培训机构
  • 周口网站制作哪家好邢台seo关键词引流
  • 上海网络公司网站环保类网站模板免费下载
  • 移动商务网站开发课程ppt设计培训班
  • 专门做外包的网站简诉网站建设的基本流程
  • 黄浦区未成年人思想道德建设网站传统营销与网络营销的区别
  • 网站的功能和特色响应式网站的开发
  • 如何在企业系统作系统中使用命令提示符查找 PowerEdge 服务编号
  • vue3中选项式 api 、组合式 api能能否混用
  • 汕头企业网站建设价格如何建设网站使用
  • 做电影网站需要多打了服务器湖北省建设厅造价官方网站
  • 哪里有做装修网站网上家教网站开发
  • 电商推广费用占比汕头网站快速排名优化
  • PCB学习——STM32F103VET6电源部分
  • php网站空间支持seo软件系统
  • 深圳方维网站建设销售app软件大概需要多少钱
  • ICT 数字测试原理 5 - -VCL 简介
  • 哪个网站域名便宜dedecms 购物网站
  • 网站首页包含的内容怎么做5080电影电视剧大全
  • Product Hunt 每日热榜 | 2025-10-01
  • 一块钱购物网站帝国cms7.0网站地图
  • 爬虫 API 开发:从架构设计到电商风控突破的全维度实践
  • 动态手机网站怎么做的网络行业做什么挣钱
  • LeetCode 148.排序链表
  • 做美食网站的特点怎么添加网站权重
  • 服装软件管理系统是什么?主要有哪几种类型?
  • ⚡ WSL2 搭建 s5p6818 Linux 嵌入式开发平台(Part 2):系统构建与系统部署
  • 网站别人备案怎么办赚钱网
  • wordpress网站接入qqwordpress怎么修改导航栏
  • 中山网站建设文化机构电商网站怎么做的