list的模拟实现详解

embedded/2025/1/19 0:53:41/

文章目录

  • list的模拟实现
    • list的迭代器
    • begin()和end()

list_2">list的模拟实现

#pragma once
#include<iostream>
#include<list>using namespace std;namespace wbc
{// 类模版template<class T>struct list_node // 链表的节点{T _data;list_node<T>* _next;list_node<T>* _prev;// 默认构造list_node(const T& val = T()):_data(val),_next(nullptr),_prev(nullptr){}};template<class T>struct list_iterator{typedef list_node<T> Node;typedef list_iterator<T> Self;Node* _node;// 构造list_iterator(Node* node):_node(node){}T& operator*(){return _node->_data;}Self& operator++(){_node = _node->_next;return *this;}Self& operator--(){_node = _node->_prev;return *this;}bool operator!=(const Self& s) const {return _node != s._node;}bool operator==(const Self& s) const {return _node == s._node;}};template<class T>class list // 链表的结构{typedef list_node<T> Node;public:typedef list_iterator<T> iterator;iterator begin(){// 有名对象/*iterator it(_head->_next);return it;*/// 匿名对象//return iterator(_head->_next);return _head->_next;// 单参数的构造函数支持隐式类型的转化}// end是最后一个位置的下一个iterator end(){return _head;}// 构造list(){_head = new Node;_head->_next = _head;_head->_prev = _head;_size = 0;}// 头插void push_front(const T& x){insert(begin(), x);}// 尾插void push_back(const T& x){/*Node* newnode = new Node(x);Node* tail = _head->_prev;tail->_next = newnode;newnode->_prev = tail;newnode->_next = _head;_head->_prev = newnode;++_size;*/insert(end(), x);}// 插入,在pos之前插入一个xvoid insert(iterator pos,const T& x){Node* cur = pos._node;Node* prev = cur->_prev;// prev newnode curNode* newnode = new Node(x);prev->_next = newnode;cur->_prev = newnode;newnode->_next = cur;newnode->_prev = prev;++_size;}// 删除void 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;}// 尾删void pop_back(){erase(--end());}// 头删void pop_front(){erase(begin());}size_t size() const{return _size;}bool empty() const{return _size == 0;}private:Node* _head;size_t _size;};void test_list1(){list<int> ls;ls.push_back(1);ls.push_back(2);ls.push_back(3);ls.push_back(4);ls.push_back(5);list<int>::iterator it = ls.begin();while (it != ls.end()){cout << *it << endl;++it;}cout << endl;for (auto ch : ls){cout << ch << " ";}cout << endl;}
}

list_218">list的迭代器

1.list迭代器重载的operator++不是原生指针,不能直接加到下一个位置,vector,string的迭代器是原生指针可以直接加到下一个位置
2.list的operator* 也需要重载不然* 之后是一个节点,++不能到下一个位置,实现的operator *解引用拿到的节点里的值

    template<class T>struct list_iterator{typedef list_node<T> Node;typedef list_iterator<T> Self;Node* _node;// 构造list_iterator(Node* node):_node(node){}T& operator*(){return _node->_data;}Self& operator++(){_node = _node->_next;return *this;}Self& operator--(){_node = _node->_prev;return *this;}bool operator!=(const Self& s) const {return _node != s._node;}bool operator==(const Self& s) const {return _node == s._node;}};

begin()和end()

        iterator begin(){// 有名对象/*iterator it(_head->_next);return it;*/// 匿名对象//return iterator(_head->_next);// 返回的是哨兵位节点的下一个位置return _head->_next;// 单参数的构造函数支持隐式类型的转化}// end是最后一个位置的下一个iterator end(){return _head;}

http://www.ppmy.cn/embedded/155089.html

相关文章

Docker镜像配置

Docker 镜像配置 Docker 安装完成后镜像一直获取不成功&#xff0c;网上也有很多方法&#xff0c;貌似都不太管用&#xff0c;这里详细说明一下&#xff0c;最近很多镜像源都不能用了&#xff0c;出现无法拉取镜像的问题先从镜像源开始解决。 问题复现 wjxwjx-WUJIE16:~$ dock…

智能新浪潮:亚马逊云科技发布Amazon Nova模型

在2024亚马逊云科技re:Invent全球大会上&#xff0c;亚马逊云科技宣布推出新一代基础模型Amazon Nova&#xff0c;其隶属于Amazon Bedrock&#xff0c;这些模型精准切入不同领域&#xff0c;解锁多元业务可能&#xff0c;为人工智能领域带来革新。 带你认识一起了解Amazon Nova…

VSCode代理配置导致的SSL证书验证错误及解决方案

问题现象 遇到SSL证书验证错误&#xff1a; FetchError: Hostname/IP does not match certificates altnames: Host: api.github.com. is not in the certs altnames: DNS:draw.yxwl.asia原因分析 使用代理服务导致的证书验证问题请求被重定向到错误的服务器DNS或网络配置问…

【C++篇】红黑树的实现

目录 前言&#xff1a; 一&#xff0c;红黑树的概念 1.1&#xff0c;红黑树的规则 1.2&#xff0c;红黑树的最长路径 1.3&#xff0c;红黑树的效率分析 二&#xff0c;红黑树的实现 2.1&#xff0c;红黑树的结构 2.2&#xff0c;红黑树的插入 2.2.1&#xff0c;大致过程…

T-SQL语言的计算机基础

T-SQL语言的计算机基础 引言 在当今信息技术迅猛发展的时代&#xff0c;数据已成为企业和组织决策的重要基础。而处理和管理数据的工具和语言也日益成为IT专业人员必备的技能之一。T-SQL&#xff08;Transact-SQL&#xff09;作为微软SQL Server数据库的扩展&#xff0c;是一…

STM32 FreeRTOS中断管理

STM32 FreeRTOS 中断管理 一、中断优先级配置 在STM32上使用FreeRTOS时&#xff0c;合理配置中断优先级是非常重要的。STM32使用8位宽的寄存器来配置中断的优先等级&#xff0c;但实际只使用了高4位&#xff08;7:4&#xff09;&#xff0c;因此提供了最大16级的中断优先级。中…

【使用EasyExcel快速实现数据下载到Excel功能】

使用EasyExcel快速实现数据下载到Excel功能 EasyExcel官方文档 1. 引言 在Web应用开发中&#xff0c;数据导出为Excel文件是一个常见的需求。本文将介绍如何使用EasyExcel库快速实现数据的下载功能。我们将通过一个具体的例子来展示如何设置响应头、获取数据并将其写入Excel…

leetcode 3095. 或值至少 K 的最短子数组 I

题目&#xff1a;3095. 或值至少 K 的最短子数组 I - 力扣&#xff08;LeetCode&#xff09; 加班用手机刷水题 class Solution { public:int minimumSubarrayLength(vector<int>& nums, int k) {int n nums.size();int m, l, ret n 10;for (int i 0; i < n…