【C++模拟实现】list的模拟实现

这篇具有很好参考价值的文章主要介绍了【C++模拟实现】list的模拟实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++模拟实现】list的模拟实现


作者:爱写代码的刚子

时间:2023.9.3

前言:本篇博客关于list的模拟实现和模拟实现中遇到的问题

list模拟实现的部分代码

namespace test
{
	template<class T>
	struct list_node//默认公有
	{
		list_node<T>* _next;
		list_node<T>* _prev;
		T _val;

		list_node(const T& val = T())
			:_next(nullptr)
			,_prev(nullptr)
			,_val(val)
		{}
	};

	template<class T,class Ref,class Ptr>
	struct __list_iterator
	{
		typedef list_node<T> Node;
		typedef __list_iterator<T, Ref, Ptr> Self;
		Node* _node;

		__list_iterator(Node* node=nullptr)
		:_node(node)
		{}
		__list_iterator(const Self&l)
		:_node(l._node)
		{}
		
		Ref operator*()
		{
			return _node->_val;
		}
		Ptr operator->()
		{
			return &_node->_val;
		}

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

		Self& operator++(int)
		{
			Self tmp(_node);
        return tmp;
		}
		Self& operator--() 
    {
       _node=_node->_prev;
			return *this;
    }
    Self& operator--(int) 
    {
        Self tmp(*this);
        _node=_node->_prev;
			  return *this;
    }
		bool operator!=(const Self& it) const//引用时一定要注意是否要加上const,防止权限放大,这里需要加上!!!
		{
			return _node!=it._node;
		}

		bool operator==(const Self& it) const
		{
			return _node==it._node;
		}
	};

	template<class T>
	class list
	{
		typedef list_node<T> Node;

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

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

		iterator end()
		{
			//return _head;
			return iterator(_head);
		}

		list()
		{
			_head=new Node;
      _head->_prev=_head;
      _head->_next=_head;
		}

		~list()
		{
			clear();
      delete _head;
      _head=nullptr;
		}
        
    void clear()
    {
        iterator it = begin();
        while(it!=end())
        {
             it=erase(it);
        }
    }

		void push_back(const T& x)
		{
			insert(end(),x);//注意这里是end(),不是end()-1;
		}

		void pop_back()
		{
			erase(--end());
		}

		iterator insert(iterator pos, const T& x)
		{
			Node*newnode = new Node(x);
			
			pos._node->_prev->_next=newnode;
			newnode->_prev=pos._node->_prev;
			
			newnode->_next=pos._node;
			pos._node->_prev=newnode;
			return newnode;
		}
		iterator erase(iterator pos)
		{
			Node*tmp=pos._node;
			Node*next=tmp->_next;
			tmp->_prev->_next=tmp->_next;
			tmp->_next->_prev=tmp->_prev;
			delete tmp;
			tmp = nullptr;
			return next;
		}
	private:
		Node* _head;
    };
}

list模拟实现中的要点

const_iterator的实现

我们选择使用模版参数,复用iterator的类,设置三个模版参数:template<class T,class Ref,class Ptr>并且typedef __list_iterator<T, const T& ,const T*> const_iterator,具体看代码的实现

push_back

push_back函数中复用了insert函数,但是注意的是传入的参数是end(),并不和pop_back函数中一样传入–end();

operator运算符重载

由于迭代器的实现类使用了模版参数,所以有两种类:const_iterator和iterator,所以在使用引用作为传入参数时需注意引用要加const!!!防止使用const_iterator类时权限放大!!!

iterator begin()函数

在此函数中可以使用return _head->_next;编译器会自动使用构造函数构造iterator类


附:类的拷贝构造一定要使用引用,并考虑是否再加上const。文章来源地址https://www.toymoban.com/news/detail-706554.html

到了这里,关于【C++模拟实现】list的模拟实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++初阶之一篇文章教会你list(模拟实现)

    成员类型表 这个表中列出了C++标准库中list容器的一些成员类型定义。这些类型定义是为了使list能够与C++标准库的其他组件协同工作,并提供一些通用的标准接口。每个成员类型的用处: value_type : 这个成员类型代表list容器中存储的数据类型,即模板参数T的类型。 allocator_

    2024年02月12日
    浏览(26)
  • 【C++初阶9-list实现】封装——我主沉浮,何不能至?

    翻阅文档即可。 带头双向循环链表。 *数据结构初阶已经实现过,这里只是变成类和对象的版本 list的实现,价值最大的不是这里,而是迭代器…… 封装,我主沉浮,何不能至? 封装给了我们很灵活的操作空间。为什么这么说? 迭代器是一种类的内嵌类型,具有指针行为,

    2023年04月27日
    浏览(28)
  • C++初阶-vector类的模拟实现

    C++ STL中的vector就类似于C语言当中的数组,但是vector又拥有很多数组没有的接口,使用起来更加方便。 相比于STL中的string,vector可以定义不同的数据类型。 迭代器的本质可以暂时看作是指针,模拟实现vector,需要定义三个指针:指向起始位置_start,指向最后一个有效元素的下

    2024年02月04日
    浏览(145)
  • 【C++初阶】学习string类的模拟实现

    前面已经学习了string类的用法,这篇文章将更深入的学习string类,了解string类的底层是怎么实现的。当然,这里只是模拟一些常用的,不常用的可以看文档学习。 我们一共创建两个文件,一个是test.cpp文件,用于测试;另一个是string.h文件,用于声明和定义要模拟的string类。

    2024年02月03日
    浏览(39)
  • 【C++初阶】模拟实现string的常见操作

    👦个人主页:@Weraphael ✍🏻作者简介:目前学习C++和算法 ✈️专栏:C++航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨ 为了方便管理代码,分两个文件来写: Test.cpp - 测试代码逻辑 string.h - 模拟实现 strin

    2024年02月12日
    浏览(40)
  • 【C++初阶】9. string类的模拟实现

    string类的完整实现放这里啦!快来看看吧 string类的作用就是将字符串类型实现更多功能,运算符重载,增删改查等等操作,所以其成员就包含char*的字符串 在之前的学习过程中,我们了解到类中存在的六个默认函数,其中就包含默认构造函数,那么对于string类是否需要用户自

    2024年02月09日
    浏览(28)
  • 【C++模拟实现】list的模拟实现

    作者:爱写代码的刚子 时间:2023.9.3 前言:本篇博客关于list的模拟实现和模拟实现中遇到的问题 list模拟实现的部分代码 list模拟实现中的要点 const_iterator的实现 我们选择使用模版参数,复用iterator的类,设置三个模版参数: templateclass T,class Ref,class Ptr 并且 typedef __list_iter

    2024年02月09日
    浏览(39)
  • 【C++初阶】第八站:string类的模拟实现

    目录 string类的模拟实现 经典的string类问题 浅拷贝 深拷贝 写时拷贝(了解) 构造函数 string的全缺省的构造函数: string的拷贝构造函数 传统写法 现代写法 string的赋值重载函数 传统写法 现代写法 string的无参构造函数: 遍历函数 operator[ ] 迭代器 迭代器的底层实现begin和end:

    2024年04月28日
    浏览(29)
  • 【C++初阶】10. vector的使用及模拟实现

    vector的文档介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 必要时查

    2024年02月06日
    浏览(40)
  • 【C++初阶】STL详解(四)vector的模拟实现

    本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C++ 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 注:为了防止与标准库当中的vector产生命名冲突

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包