news 2026/9/11 12:40:30

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/9/11 18:47:44

【安全专家亲授】私有化Dify的SSL配置秘诀:保障数据传输不被窃取

第一章&#xff1a;私有化 Dify 的 SSL 配置在私有化部署 Dify 时&#xff0c;启用 HTTPS 是保障通信安全的关键步骤。通过配置 SSL 证书&#xff0c;可以确保前端与后端之间的数据传输加密&#xff0c;防止中间人攻击和敏感信息泄露。通常使用 Nginx 作为反向代理服务器来实现…

作者头像 李华
网站建设 2026/9/10 3:13:14

Vue3+JS 高级前端面试题

题目 1&#xff1a;Vue3 响应式边界问题与复杂状态管理&#xff08;电商购物车场景&#xff09;问题在 Vue3 电商项目的购物车模块中&#xff0c;存在以下场景&#xff1a;购物车数据为深层嵌套对象&#xff08;{ list: [{ goods: { sku: [], price: 0 }, count: 1 }], selecte…

作者头像 李华
网站建设 2026/9/11 15:19:18

海康威视智能工厂,是如何走向“领航”的?

破解“小批量、多品种、大规模定制”制造难题。文&#xff5c;徐鑫编&#xff5c;任晓渔浙江桐庐的海康威视制造基地的车间里&#xff0c;1500台移动机器人在厂房内穿梭不停&#xff0c;精准地把物料从各级仓储货架配送到线头。全自动无人化生产线上&#xff0c;AI及智能感知技…

作者头像 李华
网站建设 2026/9/11 15:00:08

《深入昇腾底层:Ascend C 编程模型与高性能算子开发实战》

1. 背景&#xff1a;为何需要 Ascend C&#xff1f;在大模型时代&#xff0c;AI 算力需求呈指数级增长。通用深度学习框架&#xff08;如 PyTorch、TensorFlow&#xff09;虽提供了丰富的高层 API&#xff0c;但在面对以下场景时往往力不从心&#xff1a;框架未支持的新型算子&…

作者头像 李华
网站建设 2026/9/11 16:01:54

实战 Ascend C:从零实现高性能自定义算子

引言&#xff1a;为什么你需要亲手写一个 Ascend C 算子&#xff1f;在 AI 工程实践中&#xff0c;我们常常遇到这样的困境&#xff1a;现有深度学习框架提供的算子无法满足特定需求——可能是精度要求更高、可能是计算模式特殊、也可能是性能瓶颈卡在某个环节。此时&#xff0…

作者头像 李华
网站建设 2026/9/11 1:39:10

掌握这3种R包,轻松完成空间转录组细胞轨迹建模!

第一章&#xff1a;空间转录组的 R 语言细胞轨迹分析空间转录组技术结合了基因表达数据与组织空间位置信息&#xff0c;为解析细胞异质性和发育轨迹提供了全新视角。利用 R 语言进行细胞轨迹推断&#xff08;pseudotime analysis&#xff09;&#xff0c;能够揭示细胞在空间维度…

作者头像 李华