DeepSeek-R1:面向工程落地的长上下文稳定型开源大模型
2026/6/11 3:57:53
template<classT>structlist_node{T _data;// 节点存储的数据list_node<T>*_next;// 指向下一个节点的指针list_node<T>*_prev;// 指向前一个节点的指针list_node(constT&data=T()):_data(data),_next(nullptr),_prev(nullptr){}};list_node<T>中必须包含模板参数TT()对于内置类型会初始化为0,对于类类型调用默认构造函数template<classT,classRef,classPtr>structlist_iterator{typedeflist_node<T>Node;// 节点类型别名typedeflist_iterator<T,Ref,Ptr>Self;// 迭代器自身类型别名Node*_node;// 当前迭代器指向的节点指针list_iterator(Node*node):_node(node){}// 操作符重载...};T(数据类型),Ref(引用类型),Ptr(指针类型)Node和Self只在类内部有效_node是Node*类型,存储节点地址Refoperator*(){return_node->_data;}T&或const T&_node->_data访问Ptroperator->(){return&_node->_data;}&取地址操作符,返回T*或const T*it->member被转换为(&it._node->_data)->memberPtr控制Self&operator++(){_node=_node->_next;return*this;}++++it_node指向下一个节点*this:返回当前迭代器对象本身的引用Selfoperator++(int){Selftmp(*this);_node=_node->_next;returntmp;}Self tmp(*this)保存当前状态booloperator!=(constSelf&s)const{return_node!=s._node;}booloperator==(constSelf&s)const{return_node==s._node;}const Self&,避免不必要的拷贝template<classT>classlist{typedeflist_node<T>Node;// 节点类型别名public:// 迭代器类型别名typedeflist_iterator<T,T&,T*>iterator;typedeflist_iterator<T,constT&,constT*>const_iterator;private:Node*_head;// 头节点指针size_t _size;// 链表大小};list<T>传递给list_iterator和list_nodeiterator和const_iterator是公有接口_head和_size是私有实现细节iteratorbegin(){return_head->_next;// 头节点的下一个节点是第一个有效元素}iteratorend(){return_head;// 头节点作为尾后迭代器}const_iteratorbegin()const{return_head->_next;}const_iteratorend()const{return_head;}_head是哨兵节点,不存储有效数据voidempty_init(){_head=newNode;// 创建头节点_head->_next=_head;// 初始化next指针指向自身_head->_prev=_head;// 初始化prev指针指向自身_size=0;// 大小设为0}list(){empty_init();}iteratorinsert(iterator pos,constT&x){Node*cur=pos._node;// 当前节点Node*prev=cur->_prev;// 前一个节点Node*newnode=newNode(x);// 创建新节点// 调整指针,将新节点插入到prev和cur之间newnode->_next=cur;cur->_prev=newnode;newnode->_prev=prev;prev->_next=newnode;++_size;// 链表大小增加returnnewnode;// 返回指向新节点的迭代器}iteratorerase(iterator pos){assert(pos!=end());// 不能删除头节点Node*cur=pos._node;// 要删除的节点Node*prev=cur->_prev;// 前驱节点Node*next=cur->_next;// 后继节点// 调整指针,跳过被删除节点prev->_next=next;next->_prev=prev;deletecur;// 释放节点内存--_size;// 链表大小减少returniterator(next);// 返回被删除节点的下一个节点的迭代器}pos != end()必须为真delete cur释放节点return iterator(next)而不是return nextlist(constlist<T><){empty_init();for(auto&e:lt)// 遍历源链表{push_back(e);// 将每个元素添加到新链表}}empty_init()list<T>&operator=(list<T>lt)// 传值调用,自动拷贝{swap(lt);// 交换当前对象与拷贝对象return*this;}voidswap(list<T><){std::swap(_head,lt._head);std::swap(_size,lt._size);}~list(){clear();// 删除所有有效节点delete_head;// 删除头节点_head=nullptr;}voidclear(){autoit=begin();while(it!=end()){it=erase(it);// 逐个删除节点,erase返回下一个节点的迭代器}}_head = nullptr防止悬垂指针// 当用户声明 list<int> 时:// 1. list_node<int> 被实例化// 2. list_iterator<int, int&, int*> 被实例化(普通迭代器)// 3. list_iterator<int, const int&, const int*> 被实例化(const迭代器)// 4. list<int> 被实例化// 实际编译器生成的代码:structlist_node_int{int_data;list_node_int*_next;list_node_int*_prev;// ...};structlist_iterator_int_ref{list_node_int*_node;// 操作符重载...};classlist_int{list_node_int*_head;size_t _size;// 成员函数...};// 在list<T>内部:typedeflist_iterator<T,T&,T*>iterator;// 当 T = int 时,展开为:typedeflist_iterator<int,int&,int*>iterator;// 在list_iterator内部:typedeflist_node<T>Node;// 当 T = int 时,展开为:typedeflist_node<int>Node;list<T> ↓ 传递T list_node<T> ↓ 传递T list_iterator<T, Ref, Ptr>每个类模板都需要正确的参数传递
| 函数 | 错误返回 | 正确返回 | 原因 |
|---|---|---|---|
erase | return next; | return iterator(next); | next是Node*,需要构造iterator |
operator++() | return this; | return *this; | this是指针,*this是对象 |
operator++(int) | return *this; | return tmp; | 后置++应返回原值的副本 |
| 操作 | 失效的迭代器 | 原因 |
|---|---|---|
insert | 无 | 节点地址不变 |
erase | 被删除节点及其之后的迭代器 | 节点被删除 |
push_back/pop_back | end()可能失效 | 哨兵节点可能变化 |
// 正确顺序1.new分配内存2.设置指针连接3.++_size// 删除时1.调整指针跳过被删除节点2.delete释放内存3.--_size