当前位置: 首页 > news >正文

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; }; }

模拟实现如上

http://www.cnnetsun.cn/news/90115.html

相关文章:

  • 【安全专家亲授】私有化Dify的SSL配置秘诀:保障数据传输不被窃取
  • Vue3+JS 高级前端面试题
  • 海康威视智能工厂,是如何走向“领航”的?
  • 《深入昇腾底层:Ascend C 编程模型与高性能算子开发实战》
  • 实战 Ascend C:从零实现高性能自定义算子
  • 掌握这3种R包,轻松完成空间转录组细胞轨迹建模!
  • 【Dify Tesseract字体适配终极指南】:破解OCR识别失败的9大字体陷阱
  • Docker + 智能Agent日志管理新思路(仅限高级工程师掌握的3种架构模式)
  • 揭秘空间转录组细胞类型注释:如何用R语言精准识别每一种细胞
  • [吾爱大神原创工具] 电话号码过滤,号码排序-乱序,清除非手机号,消重,导出(依旧颜值高)
  • Dify平台Agent版本管理全解析:从入门到高可用架构设计
  • 为什么90%的生物信息分析师都在用R做RNA结构研究?真相令人震惊
  • 【稀缺资源】Dify + Tesseract 5.3多语言支持实现路径首次公开
  • 还在手动写Dify用例?Agent驱动自动化测试已成主流!
  • RSA 加密体制及其安全性分析
  • 【视频帧提取效率翻倍秘籍】:Dify帧率设置背后的黄金参数揭秘
  • 在C#上运行YOLOv11模型---CPU版
  • 关于uniapp vue2 canvas重绘元素节点时,提示cos of null相关异常警告,导致js线程崩溃,vue响应式丢失的问题
  • 【微服务稳定性提升利器】:基于Dify与Spring AI的异常熔断与恢复策略
  • concurrent hashmap原理,扩容,扩容时怎么保证线程安全?
  • 空间转录组降维必杀技:5步用R语言完成PCA、t-SNE与UMAP优化
  • 【R语言与量子计算加速新突破】:GPU如何将量子模拟效率提升10倍?
  • AWS专家Greg Coquillo提出的 6种LLM ORCHESTRATION PATTERNS解析
  • “.商标”不等同于商标权:企业做知识产权保护,别把“后缀名”当“确权证”
  • 面向削峰填谷的电动汽车多目标优化调度策略
  • 如何在30分钟内完成Dify与Spring AI的无缝部署?资深架构师亲授秘诀
  • 【Vue知识点总结】Vue中的namespaced命名空间详解
  • 告别单一生态限制,构建R-Python一体化可视化工作流
  • 论基于REST服务的Web应用系统设计
  • R语言在气象数据分析中的应用(相关性建模全攻略)