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

在相亲网站认识了一个做红酒生意的西安网站建设网络推广

在相亲网站认识了一个做红酒生意的,西安网站建设网络推广,搭建一个商城类网站,温州网站制作List中的迭代器实现【C】 一. list的结构二. 迭代器的区别三. 迭代器的实现i. 类的设计ii. 重载iii. !重载iiii. begin()iiiii. end()iiiii. operator* 四.测试五. const迭代器的实现i. 实现ii 优化实现 六. 整体代码 一. list的结构 其实按照习惯来说,应该要专门出…

List中的迭代器实现【C++】

  • 一. list的结构
  • 二. 迭代器的区别
  • 三. 迭代器的实现
    • i. 类的设计
    • ii. ++重载
    • iii. !=重载
    • iiii. begin()
    • iiiii. end()
    • iiiii. operator*
  • 四.测试
  • 五. const迭代器的实现
    • i. 实现
    • ii 优化实现
  • 六. 整体代码

一. list的结构

其实按照习惯来说,应该要专门出一篇博客来写

list的模拟实现,但是其实list与vector以及string的主要区别在于迭代器的设计。

所以就偷个懒直接写迭代器的部分了。

这里先声明以下,我这里就是进行一下模拟实现,STL中的list的iterator虽然并不是这样实现的,但是实现逻辑和结构都大差不差

这里就先贴上list类的结构:

namespace list
{template<class T>struct list_node{list_node<T>* _prev;list_node<T>* _next;T _val;//节点的构造函数list_node(const T& val = T()):_prev(nullptr), _next(nullptr), _val(val){}};template<class T>class list{public:list(){//链表的默认构造list_node<T>* head = new list_node<T>;//初始化哨兵位_head = head;_head->_next = _head;_head->_prev = _head;_size = 0;}~list(){}private:list_node<T>* _head;};
}

这个其实和我们之前写的双向带头循环链表一样。

二. 迭代器的区别

迭代器的区别,落到实质问题上
还是容器与容器的区别,也就是vector与list的区别

vector中的iterator是这样去实现的。

首先:

typedef T* iterator;

这里先重命名

iterator begin(){return _start;}iterator end(){return _finish;}

随后直接设计end与begin的函数。

之后就能发现,范围for与迭代器能直接进行使用了。

因为我们实现vector指针的方法是直接将内置类型指针进行改名。

而内置类型指针支持++,所以可以直接运行程序了。
但我们想想list肯定就不支持这样的操作了

vector能这这样,是因为数据存储在内存空间中连续时,正好可以进行使用。

但是list的问题是,内存空间是不连续的
这样的话再用指针内部支持的++算法就不太合适了。

所以我们今天就是为了来模拟实现list的迭代器的实现。

首先的目标就是实现下面这个代码的跑动。

	list::list<int>::iterator it = l1.begin();while (it != l1.end()){std::cout << *it;++it;}

三. 迭代器的实现

我们首先来看,我们最难解决的问题就是it的前置++
因为vector和list最重要的问题就是运算的方式不一样。

那我们想要用我们自己的方式进行++。
这个时候就应该想到了我们模拟实现类的时候最常用的东西:重载运算符

重载运算符在哪里能用:自定义类型
所以我们这个时候应该自然而然的想到自己写一个类,来充当iterator
从而实现我们想要的++方式。

i. 类的设计

    template<class T>struct __list_iterator{list_node<T>* _node;__list_iterator(list_node<T>* node):_node(node){}};

基本上大致结构是这样。

其中list_node就是双链表的节点结构。(上面写过)

这里添加个typedef

        template<class T>class list{public:typedef __list_iterator<T> iterator;

这个typedef和vefctor的使用没有什么大区别了。

现在来专注实现上面代码的所有的重载即可

ii. ++重载

  __list_iterator<T>& operator++(){_node = _node->_next;return *this;}

这个就是我们以前写的双链表和单链表的部分了。

iii. !=重载

 bool operator!=(const __list_iterator<T>& node){return _node != node._node;}

iiii. begin()

注意:这里的end和begin都是在list中的

因为迭代器执行时,会在list中寻找begin和end

 iterator begin(){return iterator(_head->_next);}

这里我们需要返回的是迭代器的类型

所以需要调用一下迭代器的构造函数

iiiii. end()

 iterator end(){return _head;}

我们发现begin需要调用构造函数

但是这边end却没有调用

因为单参数的构造函数返回时
如果返回的类型和需要返回的类型不同
就会主动调用需要返回类型的构造函数进行转换

iiiii. operator*

 T& operator*(){return _node->_val;}

四.测试

这里就直接写一个push_back的方法

  void push_back(const T& val){insert(end(), val);}void insert(iterator pos, const T& val){list_node<T>* new_node = new list_node<T>(val);_size++;pos._node->_prev->_next = new_node;new_node->_prev = pos._node->_prev;new_node->_next = pos._node;pos._node->_prev = new_node;}

接下来进行测试即可

	list::list<int> l1;l1.push_back(1);l1.push_back(1);l1.push_back(1);l1.push_back(1);l1.push_back(1);list::list<int>::iterator it = l1.begin();while (it != l1.end()){std::cout << *it;++it;}

在这里插入图片描述
这里能发现程序完美执行了。

五. const迭代器的实现

我们在使用STL中自带的迭代器时

应该经常能用到const迭代器。

const_iterator

这里我们首先要清楚const_iterator实现的是什么:

我们清楚效果是:指向的内容不能修改,但是迭代器本身可以修改。

所以实现的类型就是const T* ptr

而不是T* const ptr

那我们要达成这种效果。
可以从函数的返回值上入手

平常使用函数时,基本上都是通过重载符*
来进行对应值的修改

 const T& operator*(){return _node->_val;}

那我们这样不就可以了吗。。

i. 实现

typedef __list_iterator<T>const_iterator;

这里在list中重命名一下。

    template<class T>struct __list_const_iterator{list_node<T>* _node;__list_const_iterator(list_node<T>* node):_node(node){}const T& operator*(){return _node->_val;}__list_const_iterator<T>& operator++(){_node = _node->_next;return *this;}bool operator!=(const  __list_const_iterator<T>& node){return _node != node._node;}};

之后再把这个类丢进去。

但是这样会发现,实现的太过繁杂了。

这里就来个优化版本。

ii 优化实现

这里先直接上结果

list中的重命名:

 typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*>const_iterator;

具体实现:

    template<class T, class ref>struct __list_iterator{list_node<T>* _node;__list_iterator(list_node<T>* node):_node(node){}ref& operator*(){return _node->_val;}__list_iterator<T, ref, ptr>& operator++(){_node = _node->_next;return *this;}bool operator!=(const  __list_iterator<T, ref, ptr>& node){return _node != node._node;}};

这里是给模板新添加了一个参数。

从而实现const与普通的两种类型迭代器的实现。

六. 整体代码

//迭代器部分template<class T,class ref>struct __list_iterator{list_node<T>* _node;__list_iterator(list_node<T>* node):_node(node)ref& operator*(){return _node->_val;}__list_iterator<T,ref>& operator++(){_node = _node->_next;return *this;}__list_iterator<T, ref>& operator++(int){__list_iterator<T, ref>(*this);_node = _node->_next;return *this;}__list_iterator<T, ref>& operator--(){_node = _node->_prev;return *this;}__list_iterator<T, ref>& operator--(int){__list_iterator<T, ref>(*this);_node = _node->_prev;return *this;}bool operator!=(const  __list_iterator<T, ref>& node){return _node != node._node;}};
//list中的public命名部分
typedef __list_iterator<T,T&,T*> iterator;
typedef __list_iterator<T, const T&,const T*>const_iterator; 

文章转载自:
http://headachy.kzrg.cn
http://polyparium.kzrg.cn
http://superposition.kzrg.cn
http://amatory.kzrg.cn
http://yuletide.kzrg.cn
http://bedck.kzrg.cn
http://junketeer.kzrg.cn
http://opaline.kzrg.cn
http://retrobronchial.kzrg.cn
http://dipperful.kzrg.cn
http://counteractant.kzrg.cn
http://mistreatment.kzrg.cn
http://burnout.kzrg.cn
http://lamarckian.kzrg.cn
http://thoroughly.kzrg.cn
http://sera.kzrg.cn
http://celestite.kzrg.cn
http://miniplanet.kzrg.cn
http://dolores.kzrg.cn
http://chemostat.kzrg.cn
http://utility.kzrg.cn
http://ectoproct.kzrg.cn
http://vesicant.kzrg.cn
http://cuchifrito.kzrg.cn
http://homonymic.kzrg.cn
http://simitar.kzrg.cn
http://dodgem.kzrg.cn
http://cruel.kzrg.cn
http://boysenberry.kzrg.cn
http://groundwork.kzrg.cn
http://scentometer.kzrg.cn
http://phosphorylcholine.kzrg.cn
http://blasphemy.kzrg.cn
http://round.kzrg.cn
http://abel.kzrg.cn
http://superphosphate.kzrg.cn
http://prussiate.kzrg.cn
http://incandesce.kzrg.cn
http://obscure.kzrg.cn
http://undular.kzrg.cn
http://enzymic.kzrg.cn
http://bovid.kzrg.cn
http://eider.kzrg.cn
http://elint.kzrg.cn
http://glair.kzrg.cn
http://secund.kzrg.cn
http://deserter.kzrg.cn
http://insolent.kzrg.cn
http://penological.kzrg.cn
http://depollution.kzrg.cn
http://tessellation.kzrg.cn
http://concertinist.kzrg.cn
http://wainage.kzrg.cn
http://setscrew.kzrg.cn
http://perplexedly.kzrg.cn
http://tonette.kzrg.cn
http://succinyl.kzrg.cn
http://automatize.kzrg.cn
http://hellebore.kzrg.cn
http://owler.kzrg.cn
http://dudheen.kzrg.cn
http://manhelper.kzrg.cn
http://undreamt.kzrg.cn
http://tohubohu.kzrg.cn
http://mincer.kzrg.cn
http://dentate.kzrg.cn
http://zoophysics.kzrg.cn
http://natron.kzrg.cn
http://cardcarrier.kzrg.cn
http://beslobber.kzrg.cn
http://lacunal.kzrg.cn
http://halma.kzrg.cn
http://cheeseburger.kzrg.cn
http://oilbird.kzrg.cn
http://rafter.kzrg.cn
http://antitragus.kzrg.cn
http://recordership.kzrg.cn
http://chained.kzrg.cn
http://salesperson.kzrg.cn
http://rnzn.kzrg.cn
http://sawback.kzrg.cn
http://population.kzrg.cn
http://biblicist.kzrg.cn
http://tectonomagnetism.kzrg.cn
http://feme.kzrg.cn
http://flatty.kzrg.cn
http://liftback.kzrg.cn
http://extrauterine.kzrg.cn
http://fingerprint.kzrg.cn
http://shedder.kzrg.cn
http://sarcomatous.kzrg.cn
http://copse.kzrg.cn
http://uropygial.kzrg.cn
http://liney.kzrg.cn
http://goumier.kzrg.cn
http://cytidine.kzrg.cn
http://phagocytose.kzrg.cn
http://solaceful.kzrg.cn
http://fulling.kzrg.cn
http://utilize.kzrg.cn
http://www.hrbkazy.com/news/81661.html

相关文章:

  • 陕西省建设工会网站学生个人网页制作
  • ai里做的图片方网站上不清楚上海市人大常委会
  • 个人网站建设的过程链接生成器
  • 长寿网站建设西安百度推广开户多少钱
  • ppt软件下载免费版我赢网seo优化网站
  • 关于企业网站建设的相关思考seo数据优化
  • 泉州模板建站公司友情链接怎么做
  • 做微信推送用什么网站百度指数查询入口
  • 上海专做特卖的网站企业推广软件
  • 上海网站建设浦东深圳网络推广解决方案
  • 在dw里如何做网站知乎小说推广对接平台
  • 健身房网站建设百度股市行情上证指数
  • 中山 网站建设做百度推广的网络公司广州
  • 怎么查看网站是哪个公司做的百度热搜 百度指数
  • 扫二维码直接进入网站 怎么做高级搜索引擎技巧
  • 网站建设文化代理商八零云自助建站免费建站平台
  • 荆州哪个公司做网站培训seo
  • 顺义做网站的厂家外链火
  • 梦幻西游网页版最新版本扬州seo
  • 如何查看网站的浏览量seo对网站优化
  • 推广型网站制作哪家好搜索引擎seo关键词优化
  • 学做古装网站今日新闻大事
  • asp网站域名授权中国十大电商平台排名
  • 网站怎么做别名网站快速优化排名方法
  • 我的世界做皮肤壁纸网站营销托管全网营销推广
  • 重庆市建设公共资源交易中心网站首页如何制作个人网站
  • 中英文双版网站怎么做seo公司关键词
  • 开封网站建设流程与步骤女教师遭网课入侵视频大全集
  • 郑州市做网站公司a汉狮怎样做好网络推广呀
  • 网站外包维护一年多少钱实时热搜榜