初级C++:list的迷你实现及模板、迭代器回顾

本文详细介绍了如何使用C++模拟实现STL中的list容器,包括其内部使用的双向带头循环链表结构,以及对应的迭代器模板。重点讲解了节点模板、迭代器的操作如`->`和`*`的重载,还有容器的交换操作。此外,还探讨了不同类型的迭代器,如单向、双向和随机迭代器在不同场景下的应用。
摘要由CSDN通过智能技术生成

前言

  • 本质:双向带头循环链表

  • 实现list(双向带头循环链表)模板需要:
    • 单个节点的类模板,包含成员变量的声明,和初始化
    • 迭代器模板:成为单个节点类型的指针;成员变量的声明,初始化;成员函数++、!=、*迭代器类型对象

节点模板、迭代器模板

  • clear清理到只剩最后一个头节点即可。
    在这里插入图片描述

namespace mylist
{
	template<class T>
	struct _list_node   
	{
		_list_node<T>* _next;
		_list_node<T>* _prev;
		T _data; /数据

		_list_node(const T& x = T())
			:_next(nullptr)
			, _prev(nullptr)
			, _data(x)
	}; 

	template<class T>
	struct _list_itreator
	{

		typedef _list_node<T> Node;
	
		Node* _node;   

		_list_itreator(Node* _node)
			:_node(node)
		{}                             

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

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

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

list模板

【C++】list的模拟实现@STL —— 迭代器


重载->

  • it->-> it 调用-> 再去访问->second 编译器就优化了it->second
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

重载 *

  • 返回的是数据的引用
T& operator*()
{
	return this->_data;
}

容器的交换

  • 用容器内部的成员函数 .sawp(),交换的是头指针的值。
  • 库里面的是深拷贝,申请内存,效率太慢。

迭代器:单向,双向,随机,const

  • 单向:只能++,不能–;链表
  • 双向:可以++,也可以–;双向链表,map
  • 随机:可以++,可以–,可以+,可以-;底层是数祖的,string/vector/deque/map
  • 迭代器的本质是内置类型的指针拷贝构造和赋值重载会完成值浅拷贝。
  • 迭代器是算法和容器之间的胶合剂,对让算法对所有容器都有统一的访问方式。

总结

对于一个迭代器类型 T,我们会关心和它相关的如下信息:

  • 它是哪种类型的迭代器;
  • 它指向的数据类型是什么;
  • 这个数据类型的引用类型是什么;
  • 这个数据类型的指针类型是什么;
  • 两个迭代器的距离用什么类型表示。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值