STL库中list的迭代器实现痛点分析
创始人
2025-05-31 19:25:06
0

前文

本篇文章准备换个模式,之前都是先详解模拟实现,但是模拟实现的基本逻辑大多数老铁都是明白的,所以我们这次主要讲解STL库中list的独特性,也就是模拟实现中的重难点
文末有模拟实现的源码

一,list实现的特殊类

list实现和前面vector,string最大的区别莫过于单独封装了迭代器。
我们通常使用的迭代器分为两种:1.原生指针作为迭代器。如vector,string。2.自定义类型对原生指针进行封装,模拟指针的行为。如list。

vector:

list:

在list中,我们对原生指针进行封装,模拟指针的行为,因此我们需要在该类中实现*(),->,前置++,后置++,前置--,后置--,!=,==等函数重载

这时候可能有的老铁对,迭代器模板中三个模板参数感到惊讶,下面我们就来讲解一下。

二,迭代器模板中的多个模板参数

如图,迭代器模板参数中定义了三个模板参数,这是为什么呢?要注意这里是list中模板非常非常巧妙的一种用法。
第一个T就不用多说了,和vector中的模板参数意义一样。我们重点说第二和第三个.

2.1 Ref模板参数

Ref模板参数的产生主要是因为*()操作符重载
在实际的应用中,我们的list可能会被const修饰,导致里面的值只能读取不能修改,而如果用第一个模板参数我们则无法实现 const修饰返回值,因此我们专门写了第二个模板参数Ref来应对这种情况。
如上图所示,右边const修饰的list其中的值无法改变,我们会直接调用const_iterator迭代器进行模板实例化,这样Ref的值就为const T&,至此,我们就借助了第二个模板参数实现了正常迭代器和const修饰的迭代器的区分.

2.2 Ptr模板参数

Ptr模板参数是专门给->操作符重载准备的.

没有Ptr的话应该是这样

我们多一个模板参数的原因和Ref的原因一样,都是为了应对list被const修饰无法改变的情况
但是list迭代器中->操作符重载有一个重要的特性。如下所示

图中第313行和314行代码不一样但执行效果却一样,为什么呢?
根据语法,313行想访问_a1,应该这样写it->->_a1,但it->_a1却也可以,为什么呢?
这是因为在这里我们为了增强可读性,省略了一个->。

三,源码

#pragma once
#include 
#include 
using namespace std;
namespace mjw
{templatestruct list_node{list_node* _prev;list_node* _next;T _data;list_node(const T& val=T()):_prev(nullptr),_next(nullptr),_data(val){}};templatestruct _list_iterator{typedef list_node node;typedef _list_iterator iterator;node* _node;_list_iterator(node* n):_node(n){}//*()重载Ref operator*(){return _node->_data;}//->重载T* operator->(){return &_node->_data;}//前置++iterator& operator++(){_node = _node->_next;return *this;}//后置++iterator operator++(int){iterator tmp(*this);_node = _node->_next;return tmp;}//前置--iterator& operator--(){_node = _node->_prev;return *this;}//后置--iterator operator--(int){iterator tmp(*this);_node = _node->_prev;return tmp;}//!=重载bool operator!=(const iterator ls){return _node != ls._node;}//==重载bool operator==(const iterator ls){return _node == ls._node;}};templateclass list{public:typedef list_node node;typedef _list_iterator iterator;typedef _list_iterator const_iterator;void empty_init(){_head = new node;_head->_next = _head;_head->_prev = _head;}//构造list(){empty_init();}//区间构造//先初始化,然后一个一个尾插templatelist(InputIterator first, InputIterator last){empty_init();while (first != last){push_back(*first);++first;}}void swap(list& tmp){std::swap(_head, tmp._head);}//拷贝构造list(const list& lt){empty_init();list tmp(lt.begin(),lt.end());swap(tmp);}//赋值list& operator=(list lt){swap(lt);return *this;}//析构~list(){delete _head;_head = _head->_next = _head->_prev = nullptr;}//clearvoid clear(){iterator cur = begin();while (cur != end()){erase(cur++);}}//begin()iterator begin(){return iterator(_head->_next);}const_iterator begin() const{return const_iterator(_head->_next);}//end()iterator end(){return iterator(_head);}const_iterator end() const{return const_iterator(_head);}//尾插void push_back(const T& val){/*node* newnode = new node(val);node* next = _head;node* prev = _head->_prev;newnode->_next = next;newnode->_prev = prev;prev->_next = newnode;next->_prev = newnode;*/insert(end(), val);}//尾删void pop_back(){erase(--end());}//头插void push_front(const T& val){insert(begin(), val);}//头删void pop_front(){erase(begin());}void insert(iterator pos, const T& val){node* newnode = new node(val);node* next = pos._node;node* prev = next->_prev;newnode->_next = next;newnode->_prev = prev;prev->_next = newnode;next->_prev = newnode;}//为了防止迭代器失效,返回要删除的迭代器的下一个数据iterator erase(iterator pos){assert(pos._node != _head);node* prev = pos._node->_prev;node* next = pos._node->_next;prev->_next = next;next->_prev = prev;delete pos._node;pos._node = nullptr;return iterator(next);}private:node* _head;};}

相关内容

热门资讯

刚待不思量,吹一片、箫声过墙 “刚待不思量,吹一片、箫声过墙。”出处 出自 清代 项鸿祚 的《太常引·客中闻歌》“刚待不思量,吹一...
白居易诗歌风格特点 白居易诗歌风格特点  导语:白居易是中唐著名诗人,曾发起新乐府运动。他的诗歌题材多样,风格各异,脍炙...
描写夏日荷花的诗句 描写夏日荷花的诗句  1、锦带杂花钿,罗衣垂绿川。——吴均《采莲》  2、金红开似镜,半绿卷如杯。—...
最经典的爱情诗句 最经典的爱情诗句(精选65句)  在日常学习、工作和生活中,大家都对那些朗朗上口的诗句很是熟悉吧,诗...
“气蒸云梦泽 波撼岳阳城”全... 气蒸云梦泽,波撼岳阳城,这两句是出于孟浩然的《临洞庭湖赠张丞相》. 八月湖水平, 涵虚混太清。 气蒸...
宋词·贺铸《浣溪沙》 宋词·贺铸《浣溪沙》  在现实生活或工作学习中,大家或多或少都接触过一些经典的古诗吧,古诗是中国古代...
怀念逝去母亲的诗词 怀念逝去母亲的诗词  母爱,是一个摇篮,培养自己摇曳繁茂,母爱,是一支民歌,歌唱团结。以下是小编为大...
女子今有行,大江溯轻舟 “女子今有行,大江溯轻舟。”出处 出自 唐代 韦应物 的《送杨氏女》“女子今有行,大江溯轻舟。”全诗...
“此江若变作春酒,垒曲便筑糟... “此江若变作春酒,垒曲便筑糟丘台。”这两句是说,汉水如能变成酒,它的酒糟就可筑成山丘。语言奔放,奇思...
雨雪的唯美诗句集萃 雨雪的唯美诗句集萃  导语:诗句, 就是组成诗词的句子。诗句通常按照诗文的'格式体例,限定每句字数的...
四大美女之“羞花”杨玉环之由... 四大美女之“羞花”杨玉环之由来  杨玉环(719——756),号太真,蒲州永乐(今山西省永济)人,蜀...
侠客行 赏析-李白侠客行翻译 侠客行 赏析-李白侠客行翻译 李白侠客行翻译,这首古诗,主要赞扬了游侠的风骨和气派,表露了作者对游侠...
王安石《浪淘沙令》赏析 王安石《浪淘沙令》赏析  原文;浪淘沙令  --王安石  伊吕两衰翁,历遍穷通。一为钓叟一耕佣。  ...
赞美老师诗句名言 赞美老师诗句名言  德高鸿儒博学,望重英雄豪杰。大家是怎么赞美老师的呢?  赞美老师诗句名言1  天...
临江仙,临江仙韩淲,临江仙的... 临江仙,临江仙韩淲,临江仙的意思,临江仙赏析 -诗词大全  临江仙,临江仙韩淲,临江仙的意思,临江仙...
月亮的唯美诗句 关于月亮的唯美诗句合集  在日常学习、工作抑或是生活中,大家总免不了要接触或使用诗句吧,诗句以强烈的...
描写黄鹤楼的古诗 描写黄鹤楼的古诗  诗是一种阐述心灵的文学体裁。“诗者,感其况而述其心,发乎情而施乎艺也”,以下是小...
描写梅花的诗句 关于描写梅花的诗句(精选80句)  在学习、工作或生活中,大家总免不了要接触或使用诗句吧,诗句富于音...
描写夏天到了的诗句 描写夏天到了的诗句  夏天来了,那盛开的`荷花挺着碧绿的茎杆,像一位亭亭玉立的少女眺望着远方。  1...
古诗春晓 古诗春晓  在学习、工作乃至生活中,说到古诗,大家肯定都不陌生吧,古诗的篇幅可长可短,押韵比较自由灵...