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

网站服务器 数据库服务器北京网站优化排名推广

网站服务器 数据库服务器,北京网站优化排名推广,wordpress免费主题排行榜,施工企业绩效考核管理办法目录 1. 引言 3. list 类的实现 (1) 基本结构 (2) 初始化与清理 (3) 插入与删除 (4) 常用接口 (4) 常用接口 4. 测试代码 5. 总结 1. 引言 在C STL中,list是一个基于双向链表的容器,支持高效的头尾插入/删除操作(O(1)时间复杂度&…

目录

1. 引言

3. list 类的实现

(1) 基本结构

(2) 初始化与清理

(3) 插入与删除

(4) 常用接口

(4) 常用接口

4. 测试代码

5. 总结


1. 引言

在C++ STL中,list是一个基于双向链表的容器,支持高效的头尾插入/删除操作(O(1)时间复杂度),但不支持随机访问(O(n)时间复杂度)。本文将带你手写一个简化版的 list,并分析其核心实现。
2. 核心结构:list_node 与 __list_iterator
(1) list_node:链表的节点

template<class T>
struct list_node {list_node<T>* _next;  // 指向下一个节点list_node<T>* _prev;  // 指向前一个节点T _val;               // 存储的数据list_node(const T& val = T()) : _next(nullptr), _prev(nullptr), _val(val) {}
};
  • 双向链表节点,包含前驱(_prev)、后继(_next)指针和数据(_val)。
  • 默认构造函数初始化指针为 nullptr,数据为默认值 T()

(2) __list_iterator:链表的迭代器

template<class T, class Ref, class Ptr>
struct __list_iterator {typedef list_node<T> Node;typedef __list_iterator<T, Ref, Ptr> self;Node* _node;  // 当前指向的节点__list_iterator(Node* node) : _node(node) {}// 解引用(获取数据)Ref operator*() { return _node->_val; }// 成员访问(-> 运算符重载)Ptr operator->() { return &_node->_val; }// 前置++self& operator++() {_node = _node->_next;return *this;}// 后置++self operator++(int) {self tmp(*this);_node = _node->_next;return tmp;}// 前置--self& operator--() {_node = _node->_prev;return *this;}// 后置--self operator--(int) {self tmp(*this);_node = _node->_prev;return tmp;}// 比较运算符bool operator!=(const self& it) const { return _node != it._node; }bool operator==(const self& it) const { return _node == it._node; }
};
  • 迭代器核心功能
    • operator*():获取当前节点的数据。
    • operator->():访问当前节点的成员(如 it->_a1)。
    • ++ / --:支持双向遍历。
    • == / !=:判断迭代器是否指向同一节点。

3. list 类的实现

(1) 基本结构

template<class T>
class list {typedef list_node<T> Node;
public:typedef __list_iterator<T, T&, T*> iterator;         // 普通迭代器typedef __list_iterator<T, const T&, const T*> const_iterator;  // const迭代器list() { empty_init(); }  // 默认构造~list() { clear(); delete _head; _head = nullptr; }  // 析构// 拷贝构造list(const list<T>& lt) {empty_init();for (auto& e : lt) push_back(e);}// 赋值运算符(现代写法)list<T>& operator=(list<T> lt) {swap(lt);return *this;}// 交换两个链表void swap(list<T>& lt) {std::swap(_head, lt._head);std::swap(_size, lt._size);}
private:Node* _head;   // 哨兵头节点(不存储数据)size_t _size;  // 链表长度
};
  • 关键点
    • 哨兵节点 _head:简化边界条件处理(begin() 是 _head->_nextend() 是 _head)。
    • 拷贝构造:深拷贝,逐个插入元素。
    • 赋值运算符:现代写法(参数传值 + swap)。

(2) 初始化与清理
 

void empty_init() {_head = new Node;_head->_prev = _head;_head->_next = _head;_size = 0;
}void clear() {iterator it = begin();while (it != end()) {it = erase(it);}_size = 0;
}
  • empty_init():初始化空链表(哨兵节点自环)。
  • clear():逐个删除节点,最后重置 _size

(3) 插入与删除

// 在 pos 前插入
iterator insert(iterator pos, const T& x) {Node* cur = pos._node;Node* prev = cur->_prev;Node* newnode = new Node(x);prev->_next = newnode;newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;++_size;return iterator(newnode);
}// 删除 pos 位置的节点
iterator erase(iterator pos) {assert(pos != end());  // 不能删除哨兵节点Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;prev->_next = next;next->_prev = prev;delete cur;--_size;return iterator(next);
}
  • insert:调整前后指针,插入新节点。
  • erase:调整指针后删除节点,返回下一个有效迭代器。

(4) 常用接口

void push_back(const T& x) { insert(end(), x); }
void push_front(const T& x) { insert(begin(), x); }
void pop_back() { erase(--end()); }
void pop_front() { erase(begin()); }iterator begin() { return iterator(_head->_next); }
iterator end() { return iterator(_head); }
const_iterator begin() const { return const_iterator(_head->_next); }
const_iterator end() const { return const_iterator(_head); }size_t size() const { return _size; }

(4) 常用接口

void push_back(const T& x) { insert(end(), x); }
void push_front(const T& x) { insert(begin(), x); }
void pop_back() { erase(--end()); }
void pop_front() { erase(begin()); }iterator begin() { return iterator(_head->_next); }
iterator end() { return iterator(_head); }
const_iterator begin() const { return const_iterator(_head->_next); }
const_iterator end() const { return const_iterator(_head); }size_t size() const { return _size; }

4. 测试代码

void test_list() {list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);for (auto e : lt) cout << e << " ";  // 1 2 3cout << endl;lt.pop_front();for (auto e : lt) cout << e << " ";  // 2 3
}

5. 总结

  • list 的核心是双向链表,插入/删除高效(O(1)),但不支持随机访问。
  • 迭代器是双向迭代器,支持 ++ / --,但不支持 + / - / []
  • 哨兵节点简化边界处理begin() 指向第一个元素,end() 指向哨兵。
  • 深拷贝需手动实现(拷贝构造、赋值运算符)。

通过手写 list,可以更深入理解STL容器的底层实现!


文章转载自:

http://BCirhY4R.ymdhq.cn
http://BJoCl6D4.ymdhq.cn
http://gxQ0pcRZ.ymdhq.cn
http://S1tYupgF.ymdhq.cn
http://9nbLk9ni.ymdhq.cn
http://yklBLLc1.ymdhq.cn
http://MTjDvXJT.ymdhq.cn
http://ZSVdZXsx.ymdhq.cn
http://3pxZ4Kza.ymdhq.cn
http://zWmRx1vz.ymdhq.cn
http://LymJs6kP.ymdhq.cn
http://gJjv9s4B.ymdhq.cn
http://HLzzT3B3.ymdhq.cn
http://mnpTKZmd.ymdhq.cn
http://7VAY2T5n.ymdhq.cn
http://t6ho9ngs.ymdhq.cn
http://YA5dn0AS.ymdhq.cn
http://YABJ4TzT.ymdhq.cn
http://4qO2Gtm3.ymdhq.cn
http://wEUnPmZF.ymdhq.cn
http://CUjsvrvo.ymdhq.cn
http://9RtT2WlR.ymdhq.cn
http://Ta5HclyF.ymdhq.cn
http://t1Wsummp.ymdhq.cn
http://PuW66tUY.ymdhq.cn
http://aXvN4Ksq.ymdhq.cn
http://FI1oWvXA.ymdhq.cn
http://a4LmeVMF.ymdhq.cn
http://i7I7nNJp.ymdhq.cn
http://qJtOAcit.ymdhq.cn
http://www.dtcms.com/wzjs/734734.html

相关文章:

  • 多媒体网站建设上品设计
  • 网站下载app免费安全南昌 网站建设
  • 网站增加权重好搜搜索
  • 营销crm系统网站设计搜索引擎推广的特点
  • 网站开发程序排名手机号网站源码
  • 公司网站怎么申请怎么注册网络推广公司犯法吗
  • 网站 模板下载上海信息价查询造价信息网
  • 如何申请一个网站 新网wordpress 过滤插件
  • 登錄wordpress界面常州 网站优化
  • 网站已备案下一步怎么做工程公司起名大全字库
  • 做效果图的网站有哪些在线a视频网站一级a做爰
  • dw不用代码做网站响应式网站制作软件
  • wordpress中文问题网站关键词优化实验结果分析
  • 山东网站推广公司wordpress 企业插件
  • 网站统计分析工具的主要功能珠海网站品牌设计公司哪家好
  • wordpress 替代网站优化建设苏州
  • 建设区服务网站沧州做网站的专业公司
  • 绵阳做网站的网站备案后更换主机
  • 上饶招聘网站建设公司湖南外发加工网
  • 互联网科技公司做网站哪家好成都网站开发建设公司
  • 如何做英文网站的外链网站设计有哪些创新点
  • 深圳网站建设网站设计软文推广建设旅游网站的费用预算
  • 学网站开发好吗厨师培训机构 厨师短期培训班
  • 梅江区建设局网站微信用什么小程序可以提取文字
  • 网站建设费用 百度文库wordpress分类目录 模版
  • 珠海手机网站建设公司安的网络网站建设
  • 网站建设hnshangtian郑州市招投标信息网
  • 网站备案密码重置seo网站建设课程
  • 江西省建设职业培训学校网站西安做公司网站的公司
  • 怎么做内网网站wordpress萌主题下载地址