news 2026/8/8 10:43:22

list类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
list类
namespace bite { // List的节点类 template<class T> struct ListNode { ListNode(const T& val = T()) : _pPre(nullptr), _pNext(nullptr), _val(val) {} ListNode<T>* _pPre; ListNode<T>* _pNext; T _val; }; //List的迭代器类 template<class T, class Ref, class Ptr> struct ListIterator { typedef ListNode<T>* PNode; typedef ListIterator<T, Ref, Ptr> Self; ListIterator(PNode pNode = nullptr) :_pNode(pNode) {} ListIterator(const Self& l) : _pNode(l._pNode) {} T& operator*() { return _pNode->_val; } T* operator->() { return &*this; } Self& operator++() { _pNode = _pNode->_pNext; return *this; } Self operator++(int) { Self temp(*this); _pNode = _pNode->_pNext; return temp; } Self& operator--() { _pNode = _pNode->_pPre; return *this; } Self& operator--(int) { Self temp(*this); _pNode = _pNode->_pPre; return temp; } bool operator!=(const Self& l) { return _pNode != l._pNode; } bool operator==(const Self& l) { return !(*this != l); } PNode _pNode; }; //list类 template<class T> class list { typedef ListNode<T> Node; typedef Node* PNode; public: typedef ListIterator<T, T&, T*> iterator; typedef ListIterator<T, const T&, const T&> const_iterator; public: /////////////////////////////////////////////////////////////// // List的构造 list() { CreateHead(); } list(int n, const T& value = T()) { CreateHead(); for (int i = 0; i < n; ++i) push_back(value); } template <class Iterator> list(Iterator first, Iterator last) { CreateHead(); while (first != last) { push_back(*first); ++first; } } list(const list<T>& l) { CreateHead(); // 用l中的元素构造临时的temp,然后与当前对象交换 list<T> temp(l.cbegin(), l.cend()); this->swap(temp); } list<T>& operator=(const list<T> l) { this->swap(l); return *this; } ~list() { clear(); delete _pHead; _pHead = nullptr; } /////////////////////////////////////////////////////////////// // List Iterator iterator begin() { return iterator(_pHead->_pNext); } iterator end() { return iterator(_pHead); } const_iterator begin()const { return const_iterator(_pHead->_pNext); } const_iterator end()const { return const_iterator(_pHead); } /////////////////////////////////////////////////////////////// // List Capacity size_t size()const { size_t size = 0; ListNode* p = _pHead->_pNext; while (p != _pHead) { size++; p = p->_pNext; } return size; } bool empty()const { return size() == 0; } //////////////////////////////////////////////////////////// // List Access T& front() { assert(!empty()); return _pHead->_pNext->_val; } const T& front()const { assert(!empty()); return _pHead->_pNext->_val; } T& back() { assert(!empty()); return _pHead->_pPre->_val; } const T& back()const { assert(!empty()); return _pHead->_pPre->_val; } //////////////////////////////////////////////////////////// // List Modify void push_back(const T& val) { insert(end(), val); } void pop_back() { erase(--end()); } void push_front(const T& val) { insert(begin(), val); } void pop_front() { erase(begin()); } // 在pos位置前插入值为val的节点 iterator insert(iterator pos, const T& val) { PNode pNewNode = new Node(val); PNode pCur = pos._pNode; // 先将新节点插入 pNewNode->_pPre = pCur->_pPre; pNewNode->_pNext = pCur; pNewNode->_pPre->_pNext = pNewNode; pCur->_pPre = pNewNode; return iterator(pNewNode); } // 删除pos位置的节点,返回该节点的下一个位置 iterator erase(iterator pos) { // 找到待删除的节点 PNode pDel = pos._pNode; PNode pRet = pDel->_pNext; // 将该节点从链表中拆下来并删除 pDel->_pPre->_pNext = pDel->_pNext; pDel->_pNext->_pPre = pDel->_pPre; delete pDel; return iterator(pRet); } void clear() { iterator p = begin(); while (p != end()) { p = erase(p); } _pHead->_pPrev = _pHead; _pHead->_pNext = _pHead; } void swap(List<T>& l) { pNode tmp = _pHead; _pHead = l._pHead; l._pHead = tmp; } private: void CreateHead() { _pHead = new Node; _pHead->_pPre = _pHead; _pHead->_pNext = _pHead; } PNode _pHead; }; }

模拟实现如上

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/1 15:50:42

计算机网络基础

网络定义 多台设备通过连接介质&#xff0c;能互相传数据&#xff0c;共享资源的集合 协议&#xff1a;设备之间的沟通规则 拓扑结构 网络设备的物理连接方式 星型&#xff1a;就是有一个中间的设备转一下 总线型&#xff1a;学校机房那种所有设备连着一台设备 环型&#xff1a…

作者头像 李华
网站建设 2026/8/4 10:57:46

AI智能体(Agent)开发全攻略:概念、设计到安全运行,程序员必学

本文详解AI智能体的本质区别、三大核心特征及落地路径&#xff0c;涵盖模型选型、工具定义、指令配置等关键组件&#xff0c;解析单智能体与多智能体编排模式&#xff0c;并强调安全护栏体系的重要性&#xff0c;为开发者提供从0到1构建智能体的完整路线图&#xff0c;助力抢占…

作者头像 李华
网站建设 2026/8/6 17:11:24

LLM RAG开发进阶:多查询检索技术详解与实战代码

本文详细介绍了LLM应用中RAG开发的三个关键步骤和六个优化阶段&#xff0c;重点阐述了多查询检索策略如何提升检索准确性。通过生成多个角度的子问题进行检索并合并结果&#xff0c;有效克服传统相似性搜索的局限。文章提供了LangChain中MultiQueryRetriever的具体实现代码和优…

作者头像 李华
网站建设 2026/8/8 0:41:47

广东省考备考三要素(喻明公考)

材料结构化面试备考要注意的方面有很多&#xff0c;但是抓住关键才能有效备考。在实际的学习中&#xff0c;喻明公考提醒各位考生有三个备考的关键要素需要深入把握。一、学好普通结构化材料结构化归根到底还是在普通结构化的基础上进行的创新&#xff0c;背景材料对作答有指导…

作者头像 李华
网站建设 2026/8/5 13:44:13

好写作AI|学术萌新救星:你的“论文私教”如何把知识喂到嘴边

写论文像在迷宫里裸奔&#xff1f;别慌&#xff01;你的“学术导航仪”已上线各位刚踏入学术圈的萌新们&#xff0c;是不是觉得论文写作就像突然被扔进深海却没人教游泳&#xff1f;面对“文献综述”、“研究方法”这些专业术语一脸懵&#xff1f;别怕&#xff01;今天给你们安…

作者头像 李华
网站建设 2026/8/6 16:34:49

【紧急预警】环境指标悄然变化!用R语言快速识别趋势拐点的方法

第一章&#xff1a;环境监测的 R 语言趋势检验在环境科学领域&#xff0c;长期监测数据的趋势分析对于评估气候变化、污染水平演变及生态响应至关重要。R 语言凭借其强大的统计建模与可视化能力&#xff0c;成为执行环境趋势检验的首选工具。常用方法包括Mann-Kendall非参数趋势…

作者头像 李华