C++:模拟实现list容器(支持迭代器)

模拟实现list容器(支持迭代器)

要模拟实现一个list容器,主要就是相关头插头删尾插尾删的接口,这些非常常用。

另外有一个点灰常重要!!那就是list的迭代器,list的迭代器不能用原生指针去模拟实现,因为链表的迭代器加一是下一个节点的指针,在内存中两个节点存放的位置并不连续。

迭代器的模拟实现

因为list的迭代器会指向下一个节点,所以我们创建一个迭代器类,这个类成员函数就是一个一个节点的指针_node。该构造函数会通过一个传递过来的节点来构造对象。

Node* _node;//节点的指针

//用传过来的节点的指针构造一个ListIterator的对象
ListIterator(Node* node)
	:_node(node)
{
   }

链表的begin和end接口都是在List类里实现的,因为只有链表里才有节点的指针。
需要注意几点:

  1. begin是第一个位置的迭代器,有节点的指针就能构造迭代器。
  2. begin和end都是链表实现的,迭代器是我传过去一个节点,他构造一个ListIterator的对象。
  3. 迭代器不是节点的指针,它是一个ListIterator的自定义类型。
  4. ListIterator可以用节点的指针构造一个对象。
iterator begin()
{
   
	return iterator(_head->_next);//调它的构造函数
}
iterator end()
{
   
	return iterator(_head);//左闭右开区间
}
const迭代器

我们都知道迭代器不仅有普通迭代器还有const迭代器,那么const迭代器又该怎么写呢?很多人可能会想在实现一个类,专门是const迭代器的,那这样的话就会有大量的代码冗余了。所以怎么办呢?我们采用模板

博主画了一张调用逻辑~|ू・ω・` )
他们会根据模板参数的不同自动推演Ref和Ptr的类型。这样的话const的就会去调用const的迭代器了。实现了代码的复用,简洁明了,是不是炒鸡棒(๑•̀ㅂ•́)و✧
在这里插入图片描述

具体代码如下:

simulate_list.h

#pragma once

#include <iostream>
using namespace std;

//节点
template <class T>
struct ListNode
{
   
	T _data;
	ListNode<T>* _prev;
	ListNode<T>* _next;

	ListNode(const T& data = T())//这里给的是缺省,T()调的是T的默认构造函数
		:_prev(nullptr)
		, _next(nullptr)
		, _data(data)
	{
   }
};

//迭代器
template <class T,class Ref,class Ptr>
struct ListIterator
{
   
	typedef ListNode<T> Node;
	typedef ListIterator<T, Ref, Ptr> Self;

	Node* _node;//节点的指针

	//用传过来的节点的指针构造一个ListIterator的对象
	ListIterator(Node* node)
		:_node(node)
	{
   }

	//实现运算符的重载,比如++,节点的指针++之后就指向连续空间的下一个了,就找不到下一个节点的指针了
	//因此需要运算符的重载
	//如节点的指针++就让他指向下一个节点,并且返回这个迭代器

	Ref operator*()//返回的是节点里数据的引用:为了保证可读可写,返回引用的话我也可以改变这个节点的值
	{
   
		return _node->_data;//返回的是节点的数据
	}

	Ptr operator->()//返回data的指针,data的指针里才会有数据
	{
   
		//return &_node->_data;
		return &(operator*());//取地址
	}

	//++it; -->it.operator++()
	Self& operator++()//前置++返回++之后的
	{
   
		_node = _node->_next;//指向下一个位置
		return *this;//返回的是下一个位置的迭代器
	}

	//it++;
	Self operator++(int)//后置++返回++之前的,出了作用域不在了,所以不能返回引用
	{
   
		Self tmp(*this);//保存之前的迭代器
		_node = _node->_next;
		return tmp;
	}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值