【C++】List的模拟实现

ops/2025/1/30 21:54:55/

文章目录

  • 1.ListNode 结构体
  • 2.List成员变量与typedef
  • 3.迭代器iterator
  • 4.begin()、end()、size()、empty()、构造函数
  • 5. insert()、erase()
  • 6.push_back()、pop_back()、push_front()、pop_front()
  • 7.拷贝构造、赋值、析构
  • 8.总代码

以后有时间会更新其它成员函数

ListNode__3">1.ListNode 结构体

	template<class T>struct ListNode{ListNode<T>* _next;ListNode<T>* _prev;T _data;ListNode(const T& x = T()):_next(nullptr), _prev(nullptr), _data(x){}};

Listtypedef_20">2.List成员变量与typedef

	private:Node* _head;size_t _size;
		typedef ListNode<T> Node;public://typedef ListIterator<T> iterator;//typedef ListConstIterator<T> const_iterator;typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&, const T*> const_iterator;

3.迭代器iterator

	template<class T, class Ref, class Ptr>struct ListIterator{typedef ListNode<T> Node;typedef ListIterator<T, Ref, Ptr> Self;Node* _node;ListIterator(Node* node):_node(node){}// *it//T& operator*()Ref operator*(){return _node->_data;}// it->//T* operator->()//编译器为了可读性,省略了一个-> // it->_a1 <==> it.operator->()->a1Ptr operator->(){return &_node->_data;}// ++itSelf& operator++(){_node = _node->_next;return *this;}Self operator++(int){Self tmp(*this);_node = _node->_next;return tmp;}Self& operator--(){_node = _node->_prev;return *this;}Self operator--(int){Self tmp(*this);_node = _node->_prev;return tmp;}bool operator!=(const Self& it){return _node != it._node;}bool operator==(const Self& it){return _node == it._node;}};

4.begin()、end()、size()、empty()、构造函数

		iterator begin(){return _head->_next;}iterator end(){return _head;}//这里的iterator是自定义类型,不是指针// const迭代器,需要是迭代器不能修改,还是迭代器指向的内容?// 迭代器指向的内容不能修改!const iterator不是我们需要const迭代器//const iterator 是不能修改iterator,而我们要的是it指向的内容不能修改// T* const p1// const T* p2const_iterator begin() const{return _head->_next;}const_iterator end() const{return _head;}void empty_init(){_head = new Node;_head->_next = _head;_head->_prev = _head;_size = 0;}list(){empty_init();}size_t size() const{return _size;}bool empty(){return _size == 0;}

5. insert()、erase()

		void insert(iterator pos, const T& val){Node* cur = pos._node;Node* newnode = new Node(val);Node* prev = cur->_prev;// prev newnode cur;prev->_next = newnode;newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;_size++;}iterator erase(iterator pos){Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = next;next->_prev = prev;delete cur;_size--;return iterator(next);}

6.push_back()、pop_back()、push_front()、pop_front()

		//由于传递引用是类似传递指针的方式,因此不会触发拷贝构造,// 因此函数执行的效率会变高。// 如果你不想在函数中改变引用的值,最佳的实践是加上constvoid push_back(const T& x){insert(end(), x);}void push_front(const T& x){insert(begin(), x);}void pop_back(){erase(--end());}void pop_front(){erase(begin());}

7.拷贝构造、赋值、析构

		// lt2(lt1)list(const list<T>& lt){cout << "copy<<'\n";empty_init();for (auto& e : lt){push_back(e);}}// 需要析构,一般就需要自己写深拷贝// 不需要析构,一般就不需要自己写深拷贝,默认浅拷贝就可以void swap(list<T>& lt){std::swap(_head, lt._head);std::swap(_size, lt._size);}//赋值构造可优化为拷贝构造// lt1 = lt3list<T>& operator=(list<T> lt){swap(lt);return *this;}void clear(){iterator it = begin();while (it != end()){it = erase(it);}}~list(){clear();delete _head;_head = nullptr;}

8.总代码

	template<class T>struct ListNode{ListNode<T>* _next;ListNode<T>* _prev;T _data;ListNode(const T& x = T()):_next(nullptr), _prev(nullptr), _data(x){}};//内部类 或者 typedef// typedef ListIterator<T, T&, T*> iterator;// typedef ListIterator<T, const T&, const T*> const_iterator;// Ref表示引用,Ptr表示指针template<class T, class Ref, class Ptr>struct ListIterator{typedef ListNode<T> Node;typedef ListIterator<T, Ref, Ptr> Self;Node* _node;ListIterator(Node* node):_node(node){}// *it//T& operator*()Ref operator*(){return _node->_data;}// it->//T* operator->()//编译器为了可读性,省略了一个-> // it->_a1 <==> it.operator->()->a1Ptr operator->(){return &_node->_data;}// ++itSelf& operator++(){_node = _node->_next;return *this;}Self operator++(int){Self tmp(*this);_node = _node->_next;return tmp;}Self& operator--(){_node = _node->_prev;return *this;}Self operator--(int){Self tmp(*this);_node = _node->_prev;return tmp;}bool operator!=(const Self& it){return _node != it._node;}bool operator==(const Self& it){return _node == it._node;}};//template<class T>//struct ListConstIterator//{//	typedef ListNode<T> Node;//	typedef ListConstIterator<T> Self;//	Node* _node;//	ListConstIterator(Node* node)//		:_node(node)//	{}//	// *it//	const T& operator*()//	{//		return _node->_data;//	}//	// it->//	const T* operator->()//	{//		return &_node->_data;//	}//	// ++it//	Self& operator++()//	{//		_node = _node->_next;//		return *this;//	}//	Self operator++(int)//	{//		Self tmp(*this);//		_node = _node->_next;//		return tmp;//	}//	Self& operator--()//	{//		_node = _node->_prev;//		return *this;//	}//	Self operator--(int)//	{//		Self tmp(*this);//		_node = _node->_prev;//		return tmp;//	}//	bool operator!=(const Self& it)//	{//		return _node != it._node;//	}//	bool operator==(const Self& it)//	{//		return _node == it._node;//	}//};template<class T>class list{typedef ListNode<T> Node;public://typedef ListIterator<T> iterator;//typedef ListConstIterator<T> const_iterator;typedef ListIterator<T, T&, T*> iterator;typedef ListIterator<T, const T&, const T*> const_iterator;// const T 类型不可修改本身的值// // const int &ref=x;// 这段代码声明了一个常量引用ref,它引用了前面定义的整型常量x。// 因为是常量引用,所以不能通过ref修改x的值// // int y = 20;// const int* ptr = &y; // 指向常量的指针//这段代码声明了一个整型变量y,然后声明了一个指向整型常量的指针ptr,//它指向了变量y。因为ptr是指向常量的指针,所以不能通过ptr修改y的值。// //iterator begin()//{//	//return iterator(_head->_next);//	iterator it(_head->_next);//	return it;//}iterator begin(){return _head->_next;}iterator end(){return _head;}//这里的iterator是自定义类型,不是指针// const迭代器,需要是迭代器不能修改,还是迭代器指向的内容?// 迭代器指向的内容不能修改!const iterator不是我们需要const迭代器//const iterator 是不能修改iterator,而我们要的是it指向的内容不能修改// T* const p1// const T* p2const_iterator begin() const{return _head->_next;}const_iterator end() const{return _head;}void empty_init(){_head = new Node;_head->_next = _head;_head->_prev = _head;_size = 0;}list(){empty_init();}// lt2(lt1)list(const list<T>& lt){cout << "copy<<'\n";empty_init();for (auto& e : lt){push_back(e);}}// 需要析构,一般就需要自己写深拷贝// 不需要析构,一般就不需要自己写深拷贝,默认浅拷贝就可以void swap(list<T>& lt){std::swap(_head, lt._head);std::swap(_size, lt._size);}//赋值构造可优化为拷贝构造// lt1 = lt3list<T>& operator=(list<T> lt){swap(lt);return *this;}void clear(){iterator it = begin();while (it != end()){it = erase(it);}}~list(){clear();delete _head;_head = nullptr;}/*void push_back(const T& x){Node* newnode = new Node(x);Node* tail = _head->_prev;tail->_next = newnode;newnode->_prev = tail;newnode->_next = _head;_head->_prev = newnode;}*///由于传递引用是类似传递指针的方式,因此不会触发拷贝构造,// 因此函数执行的效率会变高。// 如果你不想在函数中改变引用的值,最佳的实践是加上constvoid push_back(const T& x){insert(end(), x);}void push_front(const T& x){insert(begin(), x);}void pop_back(){erase(--end());}void pop_front(){erase(begin());}void insert(iterator pos, const T& val){Node* cur = pos._node;Node* newnode = new Node(val);Node* prev = cur->_prev;// prev newnode cur;prev->_next = newnode;newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;_size++;}iterator erase(iterator pos){Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = next;next->_prev = prev;delete cur;_size--;return iterator(next);}size_t size() const{return _size;}bool empty(){return _size == 0;}private:Node* _head;size_t _size;};

http://www.ppmy.cn/ops/154306.html

相关文章

【BQ3568HM开发板】深入解析智能家居中控屏工程的NAPI接口设计

目录 引言 一、NAPI接口概述 二、NAPI接口设计 1. 接口定义 2. 接口实现 三、NAPI接口在智能家居中控屏中的应用 1. 灯光控制 2. 窗帘控制 四、总结 本文收发于电子发烧友论坛&#xff1a;https://bbs.elecfans.com/jishu_2474863_1_1.html。 引言 在智能家居中控屏…

【自然语言处理(NLP)】Bahdanau 注意力(Bahdanau Attention)原理及代码实现

文章目录 介绍Bahdanau 注意力&#xff08;Bahdanau Attention&#xff09;原理公式含义计算过程编码器部分注意力机制部分解码器部分 计算过程代码实现导包定义注意力解码器添加Bahdanau的decoder训练评估指标 bleu开始预测 个人主页&#xff1a;道友老李 欢迎加入社区&#x…

el-tree 父节点隐藏

这是我之前面试的一个题 让我写 如果你恰好也有这道题 希望可以帮到你 实现效果 <el-treenode-key"id"ref"tree"check-change"handleCheckChange":props"props":load"loadNode"lazyshow-checkbox //添加选择框>//深度…

深入MapReduce——计算模型设计

引入 通过引入篇&#xff0c;我们可以总结&#xff0c;MapReduce针对海量数据计算核心痛点的解法如下&#xff1a; 统一编程模型&#xff0c;降低用户使用门槛分而治之&#xff0c;利用了并行处理提高计算效率移动计算&#xff0c;减少硬件瓶颈的限制 优秀的设计&#xff0c…

上位机知识篇---Linux的shell脚本搜索、查找、管道

文章目录 前言第一部分&#xff1a;什么是shell&#xff1f;1. 基本结构脚本声明注释命令和表达式例子 2.变量控制结构条件判断 3.函数输入输出重定向 4.执行命令5.实际应用 第二部分&#xff1a;Linux的搜索、查找、管道命令1.搜索命令2.查找命令3.管道操作 总结 前言 以上就…

智能化加速标准和协议的更新并推动验证IP(VIP)在芯片设计中的更广泛应用

作者&#xff1a;Karthik Gopal, SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 随着AI技术向边缘和端侧设备广泛渗透&#xff0c;芯片设计师不仅需要考虑在其设计中引入加速器&#xff0c;也在考虑采用速度更快和带宽更高的总…

Stable Diffusion 3.5 介绍

Stable Diffusion 3.5 是由 Stability AI 推出的最新一代图像生成模型&#xff0c;是 Stable Diffusion 系列的重要升级版本。以下是关于 Stable Diffusion 3.5 的详细信息&#xff1a; 版本概述 Stable Diffusion 3.5 包含三个主要版本&#xff1a; Stable Diffusion 3.5 L…

第23篇:Python开发进阶:详解测试驱动开发(TDD)

第23篇&#xff1a;测试驱动开发&#xff08;TDD&#xff09; 内容简介 在软件开发过程中&#xff0c;测试驱动开发&#xff08;TDD&#xff0c;Test-Driven Development&#xff09;是一种强调在编写实际代码之前先编写测试用例的开发方法。TDD不仅提高了代码的可靠性和可维…