list的设计

#pragma once
#include<assert.h>
#include<iostream>
using namespace std;
namespace aqc
{template<class T>struct list_node{list_node* _next;list_node* _prev;T _data;list_node(const T& x=T())//加const防止权限放大,用引用减少拷贝:_next(nullptr),_prev(nullptr),_data(x){}};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*  tmp)//BUG--函数名报错:_node(tmp){}Ref operator*()//返回值引用或const引用,不能构成重载,不好办了//,因此传第二个模板参数,在创建迭代器时确定返回的是什么{return _node->_data;}Ptr operator->()//同上,有T*和const T*{return &(_node->_data);}self& operator++(){this->_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(_node);//显示构造_node = _node->_prev;return tmp;}bool operator!=(const self& x)const{return _node != x._node;}bool operator==(const self& x){return _node == x._node;}};template<class Iterator,class Ref,class Ptr>struct ReverseIterator{typedef ReverseIterator<Iterator, Ref, Ptr> self;Iterator _cur;ReverseIterator(Iterator it):_cur(it){}Ref operator*()//为了保持对称的形态,rbegin对end,rend对begin,解引用时要调整一下{Iterator tmp=_cur;--tmp;return *tmp;}Ptr operator->(){return &(_cur._node->_data);}self& operator++(){--_cur;return *this;}self operator++(int){self tmp = *this;--_cur;return tmp;}self operator--(){++_cur;return *this;}bool operator!=(const self& x)const{return _cur != x._cur;}};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;typedef  ReverseIterator< iterator, T&, T*> reverse_iterator;typedef  ReverseIterator<const_iterator, const T&, const T*> const_reverse_iterator;iterator begin(){return iterator(_head->_next);}const_iterator begin()const//不论普通链表还是const链表都可使用const迭代器{return const_iterator(_head->_next);}iterator end(){return iterator(_head);}const_iterator end()const{return const_iterator(_head);}reverse_iterator rbegin(){return reverse_iterator(end());}reverse_iterator rend(){return reverse_iterator(begin());}void empty_init(){_head = new node;_head->_next = _head;_head->_prev = _head;}list(){empty_init();}template<class Iterator >list(Iterator first, Iterator last){empty_init();while (first != last){push_back(*first);first++;}}void swap(list<T>& lt){std::swap(_head, lt._head);}list(list<T>& lt){empty_init();list<T> tmp(lt.begin(), lt.end());swap(tmp);}list<int>& operator=(list<T> lt){swap(lt);return *this;}void print(){for (auto e : *this){cout << e << " ";}cout << endl;}void clear(){iterator it = begin();while (it != end()){erase(it++);//it++最终it加一,返回it没加一时的临时变量}}~list(){clear();delete _head;}void push_back(const T& x){insert(end(), x);}void push_front(const T& x){insert(begin(), x);}void pop_back(){erase(--end());}void erase(iterator pos){node* prev = pos._node->_prev;node* next = pos._node->_next;prev->_next = next;next->_prev = prev;delete pos._node;}void insert(iterator pos, const T& x){node* prev = pos._node->_prev;node* pcur = pos._node;node* new_node = new node(x);prev->_next = new_node;new_node->_prev = prev;new_node->_next = pcur;pcur->_prev = new_node;}private:node* _head;};
}
1.list是带头双向循环链表
2.list的节点设计如上,两个指针和一个T类型数据data
3.list类的成员只有哨兵节点,没有size成员,这是gcc的设计思路,在获取size时遍历获得,这样在插入和删除时不用关心size的变化
4.最重要的是迭代器,list的迭代器不再和vector与string一样是原生指针了,而是封装了结点指针的类,但要注意的是  *迭代器  返回的不是节点的引用,而是节点数据的引用T&,迭代器->成员  访问的是节点数据T的成员,编译器会先调operator->得到节点数据的地址T*,然后再->访问成员
5.迭代器有三个模板参数,这是为了实例化出迭代器和const迭代器
6.反向迭代器适配正向迭代器得到,有三个模板参数同样是为了实例化出反向迭代器和const反向迭代器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/78523.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/78523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于 PyQt 的YOLO目标检测可视化界面+ nuitka 打包

在人工智能和计算机视觉领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;是一种广泛使用的实时目标检测算法。为了直观地展示YOLO算法的检测效果&#xff0c;我们使用Pyqt框架进行检测结果的可视化&#xff0c;同时为了使其能够脱离Python环境&#xff0c;我们…

2.1 阅读错题---02-04年

引言 2002年-2004年英语阅读错题汇总与分析总结。 一、02年阅读 Text 1 题目&#xff1a;21题 题型&#xff1a;细节题 原因&#xff1a;单词认错了&#xff0c;原句中 in sympathy with 译为 与…一致 &#xff1b;题干中的 sympathy 译为 同情 题目&#xff1a;22题 题…

Axure疑难杂症:中继器制作下拉菜单(多级中继器高级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 本文视频课程记录于上述地址第五章中继器专题第11节 课程主题:中继器制作下拉菜单 主要内容:创建条件选区、多级中继器…

即刻启程,踏上W55MH32高性能以太网单片机学习之路!

单芯片解决方案&#xff0c;开启全新体验——W55MH32 高性能以太网单片机 W55MH32是WIZnet重磅推出的高性能以太网单片机&#xff0c;它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身&#xff0c;具体来说&#xff0c;一颗W55MH32内置高性能Arm Cortex-M3核心…

C++负载均衡远程调用学习之上报功能与存储线程池

目录 1. Lars-reportV0.1 report模块介绍 2.Lars-reporterV0.1 reporter项目目录构建 3.Lars-ReporterV0.1 数据表和proto协议环境搭建 4.Lars-ReporterV0.1上报请求业务处理 5.Lars-ReporterV0.1上报请求模块的测试 6.Lars-ReporterV0.2开辟存储线程池-网络存储分离 1. L…

LabVIEW三轴电机控制

在工业自动化迅猛发展的当下&#xff0c;多轴伺服电机控制系统在制造业、3D 打印等众多领域的需求与日俱增。它不仅要实现高精度的单轴运动控制&#xff0c;还需保障多轴协同作业的精准度&#xff0c;对响应速度也有严格要求。LabVIEW 开发多轴伺服电机控制系统&#xff0c;有效…

驱动开发硬核特训 · Day 27(下篇):深入掌握 Common Clock Framework 架构与实战开发

节。 在本篇内容中&#xff0c;我们将围绕 Linux 内核中的时钟子系统核心架构 —— Common Clock Framework&#xff08;简称 CCF&#xff09;展开深入讲解&#xff0c;目标是帮助你全面理解其设计理念、主要数据结构、注册流程、驱动实现方式&#xff0c;以及如何基于 NXP i.M…

数据库基础:数据库类型与MySQL特点详解

一、数据库的主要类型 1. 关系型数据库(RDBMS) 特点:基于关系模型,数据以表格形式存储 代表产品:MySQL、Oracle、SQL Server、PostgreSQL 优势:ACID事务支持、强一致性、成熟的SQL标准 适用场景:需要复杂查询和事务支持的场景 2. 非关系型数据库(NoSQL) 文档型数据库:Mo…

49认知干货:产品的生命周期及类型汇总

49章:产品的生命周期与类型划分 宇宙是运动的而非静止的,任何事物亦是如此。只要是存在的事物,便必然存在周期性变化,就像四季更替中的冬日枯树、春日新芽、夏日繁茂与秋日凋零。 这也意味着:事物的发展,离不开周期的更迭与演化,死亡并非终点,而是一种新的循环转变。 …

【2025最新】为什么用ElasticSearch?和传统数据库MySQL与什么区别?

Elasticsearch 深度解析&#xff1a;从原理到实践 一、为什么选择 Elasticsearch&#xff1f; 数据模型 Elasticsearch 是基于文档的搜索引擎&#xff0c;它使用 JSON 文档来存储数据。在 Elasticsearch 中&#xff0c;相关的数据通常存储在同一个文档中&#xff0c;而不是分散…

Docker安装Gitblit(图文教程)

本章教程,使用Docker安装部署Gitblit。 一、Gitblit简介 Gitblit 是一个基于 Java 的 Git 仓库管理工具,主要用于在局域网或小型团队环境中搭建私有 Git 服务器。它提供了一个简单易用的 Web 界面,用于浏览代码、管理仓库和用户权限等。 二、拉取镜像 sudo docker pull git…

nDCG(归一化折损累计增益) 是衡量排序质量的指标,常用于搜索引擎或推荐系统

nDCG&#xff08;归一化折损累计增益&#xff09; 是衡量排序质量的指标&#xff0c;常用于搜索引擎或推荐系统。核心思想是&#xff1a;排名越靠前的高质量结果&#xff0c;对整体评分的贡献越大&#xff0c;但后续结果的贡献会逐渐“打折”。最终通过对比实际排序与理想排序的…

《从线性到二维:CSS Grid与Flex的布局范式革命与差异解析》

在前端开发的广袤宇宙中&#xff0c;CSS布局技术宛如闪耀的星辰&#xff0c;不断革新与演进&#xff0c;为构建绚丽多彩的网页世界提供了坚实的支撑。其中&#xff0c;CSS Grid布局与Flex布局作为两颗璀璨的明星&#xff0c;以其独特的魅力和强大的功能&#xff0c;深受开发者们…

2025年01月03日美蜥(杭州普瑞兼职)一面

目录 vue2 vue3 的区别react 性能优化react 组件传值v-for 和 v-if 的优先级react 中多个接口请求的数据&#xff0c;需要渲染到一个列表上怎么处理百万条数据怎么渲染vue2、vue3 的响应式原理微前端了解吗git 版本控制git mearge 和 git rebase 的区别垂直水平居中react 中实…

【聚类分析】基于copula的风光联合场景生成与缩减

目录 1 主要内容 风光出力场景生成方法 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序方法复现《融合风光出力场景生成的多能互补微网系统优化配置》风光出力场景生成部分&#xff0c;目前大多数研究的是不计风光出力之间的相关性影响&#xff0c;但是地理位置相近…

LeetCode 1128 等价多米诺骨牌对的数量 题解

今天的每日一题&#xff0c;我的思路还是硬做&#xff0c;不如评论区通过状压写的简单&#xff0c;但是答题思路加算法实现是没有问题的&#xff0c;且时间复杂度也是可以通过的&#xff0c;毕竟全是o(n) 那么我就来说一下我的思路&#xff0c;根据dominoes[i] [a, b] 与 domi…

技术部测试规范

简短测试流程&#xff1a; 开发完成 -> 本地自测 -> 测试环境自测 -> 通知测试同事复测 -> 确认无误后上生产 -> 生产环境自测 -> 再次通知测试同事复测 -> 提交产品验收。 当然可以&#xff01;以下是进一步优化后的测试流程规范&#xff0c;特别强调了开…

算法每日一题 | 入门-顺序结构-大象喝水

大象喝水 题目描述 一只大象口渴了&#xff0c;要喝 20 升水才能解渴&#xff0c;但现在只有一个深 h 厘米&#xff0c;底面半径为 r 厘米的小圆桶 &#xff08;h 和 r 都是整数&#xff09;。问大象至少要喝多少桶水才会解渴。 这里我们近似地取圆周率 π 3.14 \pi3.14 π…

Qt中实现工厂模式

在Qt中实现工厂模式可以通过多种方式&#xff0c;具体选择取决于需求和场景。以下是几种常见的实现方法&#xff1a; 1. 简单工厂模式通过一个工厂类根据参数创建不同对象。cppclass Shape {public: virtual void draw() 0; virtual ~Shape() default;};class Circle : publ…

【前端】ES6一本通_划重点_补充面试题

近两天更新完基本内容&#xff0c;后续长期更新&#xff0c;建议关注收藏点赞。 ES6&#xff08;ECMAScript 2015&#xff09;是现代 JavaScript 的基础&#xff0c;在前端面试中非常常见。 本文已汇总的本站笔记 ES6最重要10特性 对象新增 数组新增 异步、生成器 Promise 模块…