news 2026/4/23 10:42:21

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/4/23 9:55:52

《Ascend C 高级优化:GELU、LayerNorm 实现与算子融合实战》

1. 为什么优化 GELU 和 LayerNorm&#xff1f;以 LLaMA-7B 为例&#xff1a;每层包含 2 个 GELU&#xff08;FFN 中&#xff09;和 2 个 LayerNorm共 32 层 → 单次前向传播调用 128 次若每次节省 1μs&#xff0c;则每 token 节省 128μs在千亿 token 推理场景中&#xff0c;这…

作者头像 李华
网站建设 2026/4/16 21:25:13

基于模型上下文协议(MCP)的可插拔式临床AI工具链Clinical DS研究(下)

第六章 结论与未来工作 6.1 主要研究结论 本研究深入探讨了医疗AI在临床落地中的核心矛盾,即如何从“模型能答”迈向“系统可信、可用、可追溯”。为解决此矛盾,我们创新性地提出并详细设计实现了一套基于模型上下文协议(MCP)的**“可插拔式临床AI工具链”**架构。通过将复…

作者头像 李华
网站建设 2026/4/22 13:40:03

深入理解 Ascend C:昇腾 AI 芯片的高性能编程语言

引言&#xff1a;AI 芯片时代的编程新范式随着人工智能技术的飞速发展&#xff0c;专用 AI 芯片已成为支撑大模型训练与推理的关键基础设施。华为昇腾&#xff08;Ascend&#xff09;系列 AI 芯片凭借其高算力、低功耗和软硬协同设计&#xff0c;在国产 AI 芯片生态中占据重要地…

作者头像 李华
网站建设 2026/4/23 7:50:36

Claude vs Codex:核心能力差异

不是测评&#xff0c;不吹参数&#xff0c;只说工程里最值钱的能力差异。1. Claude 的核心技能 “读懂你没写清楚的代码” 强在&#xff1a; 复杂项目理解业务流程还原设计/架构层问题识别 最适合用法&#xff1a; 让它先"读代码 讲人话 找风险"像一个懂业务的高级…

作者头像 李华
网站建设 2026/4/23 7:51:14

Ascend C 入门与核心编程模型详解

引言随着人工智能和高性能计算需求的爆炸式增长&#xff0c;专用 AI 芯片成为提升算力效率的关键。华为昇腾&#xff08;Ascend&#xff09;系列 AI 处理器正是在此背景下应运而生。为了充分发挥昇腾芯片的硬件性能&#xff0c;华为推出了 Ascend C —— 一种面向昇腾 AI 处理器…

作者头像 李华
网站建设 2026/4/23 7:49:24

OSPF综合实验

实验拓扑实验要求 R4为ISP&#xff0c;其上只配置IP地址:R4与其他所直连设备间均使用公有IP; R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&#xff0c;其他路由器均有一个环回IP 所有设备…

作者头像 李华