STL list

文章目录

  • 一、list 类的模拟实现

在这里插入图片描述

list 是一个带头双向循环链表,可以存储任意类型

模板参数 T 表示存储元素的类型,Alloc 是空间配置器,一般不用传

一、list 类的模拟实现

iterator 和 const_iterator 除了下述不同外,其他代码基本一模一样:

  • iterator 调用 operator* / operator-> 返回 T& / T*
  • const_iterator 调用 operator* / operator-> 返回 const T& / const T*

为了减少代码冗余,创建一个公有的模板,并增加两个模板参数,在调用时通过传递不同的模板参数从而得到 iterator 和 const_iterator

reverse_iterator 和 const_reverse_iterator 通过封装 iterator 实现

list 类常用接口模拟实现:

//test.cpp
#include "list.h"int main()
{//starrycat::list_test5();starrycat::list_reverse_iterator_test();return 0;
}//iterator.h
#pragma oncenamespace starrycat
{template<class Iterator, class Ref, class Ptr>class __list_reverse_iterator{typedef __list_reverse_iterator<Iterator, Ref, Ptr> self;public:__list_reverse_iterator<Iterator, Ref, Ptr>() {}__list_reverse_iterator<Iterator, Ref, Ptr>(Iterator iter) : _cur(iter) {}//rbegin() 底层返回 end(),rend() 底层返回 begin()//因此在访问元素时,需要访问当前迭代器的前一个位置 Ref operator*(){Iterator tmp = _cur;return *--tmp;}Ptr operator->(){Iterator tmp = _cur;return (--tmp).operator->();}self& operator++(){--_cur;return *this;}self operator++(int){Iterator tmp = _cur;--_cur;return tmp;}self& operator--(){++_cur;return *this;}self operator--(int){Iterator tmp = _cur;++_cur;return tmp;}bool operator==(const self& s) { _cur == s._cur; }bool operator!=(const self& s) { _cur != s._cur; }private:Iterator _cur;};
}//list.h
#pragma once#include "iterator.h"
#include <iostream>
#include <assert.h>
#include <algorithm>using std::cout;
using std::endl;namespace starrycat
{//带头双向链表结点template<class T>struct __list_node{__list_node<T>* _prev;__list_node<T>* _next;T _data;};//迭代器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<T, Ref, Ptr>(){}//构造函数__list_iterator<T, Ref, Ptr>(node* node): _node(node){}//解引用重载Ref operator*(){return _node->_data;}//->重载都需要这样玩Ptr operator->(){return &(_node->_data);}//前置++重载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& s) const{return _node == s._node;}bool operator!=(const self& s) const{return _node != s._node;}};//带头双向链表template<class T>class list{public:typedef __list_node<T> node;typedef __list_iterator<T, T&, T*> iterator;typedef __list_iterator<T, const T&, const T*> const_iterator;typedef __list_reverse_iterator<iterator, T&, T*> reverse_iterator;typedef __list_reverse_iterator<const_iterator, const T&, const T*> const_reverse_iterator;void empty_Init(){_head = new node;_head->_next = _head;_head->_prev = _head;}//默认构造函数list(){empty_Init();}//迭代器区间构造template<class InputIterator>list(InputIterator first, InputIterator last){empty_Init();while (first != last){push_back(*first);++first;}}void swap(list<T>& lt){std::swap(_head, lt._head);}list(const list<T>& lt){empty_Init();list<T> tmp(lt.begin(), lt.end());swap(tmp);}list<T>& operator=(list<T> lt){swap(lt);return *this;}~list(){clear();delete _head;_head = nullptr;}void clear(){iterator it = begin();while (it != end()){it = erase(it);}}iterator begin(){return iterator(_head->_next);}const_iterator begin() const{return const_iterator(_head->_next);}iterator end(){return iterator(_head);}const_iterator end() const{return const_iterator(_head);}reverse_iterator rbegin(){return end();}const_reverse_iterator rbegin() const{return end();}reverse_iterator rend(){return begin();}const_reverse_iterator rend() const{return begin();}bool empty() const{return _head->_next == _head;}size_t size() const{size_t result = 0;node* cur = _head->_next;while (cur != _head){++result;cur = cur->_next;}return result;}T& front(){return _head->_next->_data;}const T& front() const{return _head->_next->_data;}T& back(){return _head->_prev->_data;}const T& back() const{return _head->_prev->_data;}void push_front(const T& x){//node* _head_next = _head->_next;//node* new_node = new node;//new_node->_data = x;//_head->_next = new_node;//new_node->_prev = _head;//new_node->_next = _head_next;//_head_next->_prev = new_node;insert(begin(), x);}void pop_front(){//assert(!empty());//node* del = _head->_next;//node* _head_new_next = del->_next;//_head->_next = _head_new_next;//_head_new_next->_prev = _head;//delete del;erase(begin());}void push_back(const T& x){//node* tail = _head->_prev;//node* new_node = new node;//new_node->_data = x;//tail->_next = new_node;//new_node->_prev = tail;//new_node->_next = _head;//_head->_prev = new_node;insert(end(), x);}void pop_back(){//assert(!empty());//node* del = _head->_prev;//node* new_tail = del->_prev;//new_tail->_next = _head;//_head->_prev = new_tail;//delete del;erase(--end());}iterator insert(iterator pos, const T& x){node* cur = pos._node;node* prev = cur->_prev;node* new_node = new node;new_node->_data = x;prev->_next = new_node;new_node->_prev = prev;new_node->_next = cur;cur->_prev = new_node;return pos;}iterator erase(iterator pos){node* del = pos._node;node* prev = del->_prev;node* next = del->_next;prev->_next = next;next->_prev = prev;delete del;return next;}private:node* _head;};void Print1(const list<int>& lt){list<int>::const_iterator it = lt.begin();while (it != lt.end()){//(*it) *= 10;cout << *it << " ";++it;}cout << endl;for (auto e : lt){cout << e << " ";}cout << endl;}void list_test1(){list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);list<int>::iterator it = lt.begin();while (it != lt.end()){(*it) *= 10;cout << *it << " ";++it;}cout << endl;for (auto e : lt){cout << e << " ";}cout << endl;Print1(lt);}struct A{int _a1;int _a2;//构造函数A(int a1 = 0, int a2 = 0): _a1(a1), _a2(a2){}};void Print2(const list<A>& lt){list<A>::const_iterator it = lt.begin();while (it != lt.end()){//it->_a1 *= 2;//it->_a2 *= 2;cout << it->_a1 << " " << it->_a2 << endl;++it;}cout << endl;}void list_test2(){list<A> lt;lt.push_back(A(1, 1));lt.push_back(A(2, 2));lt.push_back(A(3, 3));lt.push_back(A(4, 4));list<A>::iterator it = lt.begin();while (it != lt.end()){//cout << (*it)._a1 << " " << (*it)._a2 << endl;//-> 都需要这样玩//it->_a1 编译器默认解释为 it->->_a1 <==> it.operator->()->_a1;it->_a1 *= 10;it->_a2 *= 10;cout << it->_a1 << " " << it->_a2 << endl;++it;}cout << endl;Print2(lt);}void list_test3(){list<int> lt;cout << "empty:" << lt.empty() << endl;cout << "size:" << lt.size() << endl;lt.push_front(1);lt.push_front(2);lt.push_front(3);lt.push_front(4);for (auto e : lt){cout << e << " ";}cout << endl;cout << "empty:" << lt.empty() << endl;cout << "size:" << lt.size() << endl;lt.pop_front();lt.pop_front();//lt.pop_front();//lt.pop_front();//lt.pop_front();for (auto e : lt){cout << e << " ";}cout << endl;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto e : lt){cout << e << " ";}cout << endl;lt.pop_back();lt.pop_back();//lt.pop_back();//lt.pop_back();//lt.pop_back();//lt.pop_back();for (auto e : lt){cout << e << " ";}cout << endl;lt.front() *= 10;lt.back() *= 100;for (auto e : lt){cout << e << " ";}cout << endl;}void list_test4(){list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);for (auto e : lt){cout << e << " ";}cout << endl;//list<int>::iterator pos = std::find(lt.begin(), lt.end(), 2); errlt.insert(++lt.begin(), 20);for (auto e : lt){cout << e << " ";}cout << endl;lt.erase(++lt.begin());for (auto e : lt){cout << e << " ";}cout << endl;}void list_test5(){list<int> lt1;lt1.push_back(1);lt1.push_back(2);lt1.push_back(3);lt1.push_back(4);for (auto e : lt1){cout << e << " ";}cout << endl;list<int> lt2(lt1.begin(), lt1.end());for (auto e : lt1){cout << e << " ";}cout << endl;list<int> lt3(lt2);for (auto e : lt3){cout << e << " ";}cout << endl;lt3.clear();for (auto e : lt3){cout << e << " ";}cout << endl;lt3 = lt2;for (auto e : lt2){cout << e << " ";}cout << endl;for (auto e : lt3){cout << e << " ";}cout << endl;}void Print3(const list<int>& lt){list<int>::const_reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){//*rit *= 2;cout << *rit << " ";++rit;}cout << endl;}void Print4(const list<A>& lt){list<A>::const_reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){//rit->_a1 *= 10;//rit->_a2 *= 10;cout << rit->_a1 << " " << rit->_a2 << endl;++rit;}cout << endl;}void list_reverse_iterator_test(){list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);list<int>::reverse_iterator rit = lt.rbegin();while (rit != lt.rend()){*rit *= 2;cout << *rit << " ";++rit;}cout << endl;Print3(lt);list<A> ltA;ltA.push_back(A(1, 1));ltA.push_back(A(2, 2));ltA.push_back(A(3, 3));ltA.push_back(A(4, 4));list<A>::reverse_iterator ritA = ltA.rbegin();while (ritA != ltA.rend()){ritA->_a1 *= 10;ritA->_a2 *= 10;cout << ritA->_a1 << " " << ritA->_a2 << endl;++ritA;}cout << endl;Print4(ltA);}
}

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

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

相关文章

GPIO子系统编写LED灯的驱动、linux内核定时器

一、GPIO子系统 1.概念&#xff1a; 一个芯片厂商生产出芯片后会给linux提供一个当前芯片中gpio外设的驱动&#xff0c;我们当前只需要调用对应的厂商驱动即可完成硬件的控制。而linux内核源码中的gpio厂商驱动有很多&#xff0c;这里linux内核对厂商驱动做了一些封装&#x…

【管理运筹学】第 8 章 | 动态规划(2,动态规划的基本思想)

文章目录 引言2.2 动态规划的基本思想 写在最后 引言 承接前文&#xff0c;介绍完基本概念后&#xff0c;我们来学习动态规划的基本思想&#xff0c;用上一篇文章的最短路问题来配合说明。 2.2 动态规划的基本思想 最短路问题中的网络如下图所示&#xff0c;从 A 到 E 可以分…

零基础学前端(四)重点讲解 CSS

1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码&#xff0c;以身体感悟带动头脑去理解新知识 3. 初学者切忌&#xff0c;不要眼花缭乱&#xff0c;不要四处找其它文档&#xff0c;要坚定一个教授者的方式&#xff0c;将其学通透&#xff…

SpringMVC之自定义注解

一.什么是SpringMVC之自定义注解 二.Java注解简介 Java注解分类 JDK元注解 三.自定义注解简介 自定义注解的分类 四.自定义注解的基本案例 案例一&#xff08;获取类与方法上的注解值&#xff09; 案例二&#xff08;获取类属性上的注解属性值&#xff09; 案例三&a…

MyBatis笔记

Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c;iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于“intern…

【数据结构与算法】不就是数据结构

前言 嗨喽小伙伴们你们好呀&#xff0c;好久不见了,我已经好久没更新博文了&#xff01;之前因为实习没有时间去写博文&#xff0c;现在已经回归校园了。我看了本学期的课程中有数据结构这门课程&#xff08;这么课程特别重要&#xff09;&#xff0c;因为之前学过一点&#xf…

数据结构与算法(三)——递归

一、递归的概念 递归就是方法自己调用自己&#xff0c;每次调用时传入不同的变量。 递归有助于编程者解决复杂的问题&#xff0c;同时可以让代码变得简洁。 1.1 递归机制 递归调用规则&#xff1a; 1>当程序执行到一个方法时&#xff0c;就会开辟一个独立的空间&#xff0…

vr飞机驾驶舱模拟流程3D仿真演示加大航飞安全法码

众所周知&#xff0c;航空航天飞行是一项耗资大、变量参数很多、非常复杂的系统工程&#xff0c;因此可利用虚拟仿真技术经济、安全及可重复性等特点&#xff0c;进行飞行任务或操作的模拟&#xff0c;以代替某些费时、费力、费钱的真实试验或者真实试验无法开展的场合&#xf…

2023 Google 开发者大会:Web平台新动向

目录 前言一、Open in WordPress playground二、WebGPU三、新的核心 Web 指标INP四、Webview1、Custom Tabs2、JavaScriptEngine 五、Passkeys六、View Transitions API七、Google Chrome开发者工具优化1、覆盖HTTP的响应标头2、改变stack trance 八、Baseline总结 前言 在前不…

攻防世界-WEB-easyupload

1.新建.user.ini文件&#xff0c;内容如下 GIF89a auto_prepend_filea.jpg 2.上传该文件&#xff0c;并用burp抓包&#xff0c;将Content-Type: application/octet-stream修改为 Content-Type: image/jpg 3.放包&#xff0c;结果如下 4. 新建a.txt文件&#xff0c;内容为 GIF89…

插槽指的是什么?插槽的基础用法体验

什么是插槽 插槽(Slot)是 vue 为组件的封装者提供的能力。允许开发者在封装组件时&#xff0c;把不确定的、希望由用户指定的部分定义为插槽。 <template><p>这是MyCom1组件的第1个p标签</p><&#xff01;--通过slot标签&#xff0c;为用户预留内容占位符…

蓝牙核心规范(V5.4)10.1-BLE 入门笔记(1)

ble 规范 深入了解蓝牙LE需要熟悉相关的规格。蓝牙LE的架构、程序和协议由一项关键规范完全定义,称为蓝牙核心规范。产品如何使用蓝牙以实现互操作性由两种特殊类型称为配置文件和服务的规范集合所涵盖。图1展示了BLE规范类型及其相互关系。 1.1 蓝牙核心规范 蓝牙核心规范是…

html+js写一个可编辑的元素 支持直接向上粘贴文本或图片

有一说一来讲 CSDN 博客的编辑器还是非常厉害的 能够完美设配图片与文字的粘贴与输入 但其实 如果做个捡漏版的 js也可以完成 但这里 为了方便 我选择了vue2的环境 参考代码如下 <template><div class"editable-div" contenteditable"true" past…

WavJourney:进入音频故事情节生成世界的旅程

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 若要正确查看音频生成的强大功能&#xff0c;请考虑以下方案。我们只需要提供一个简单的指令&#xff0c;描述场景和场景设置&#xff0c;模型就会生成一个扣人心弦的音频脚本&#xff0c;突出与原始指令的最高上下文相…

小米6/6X/米8/米9手机刷入鸿蒙HarmonyOS.4.0系统-刷机包下载-遥遥领先

小米手机除了解锁root权限&#xff0c;刷GSI和第三方ROM也是米粉的一大爱好&#xff0c;这不&#xff0c;在华为发布了HarmonyOS.4.0系统后不久&#xff0c;我们小米用户也成功将自己的手机干山了HarmonyOS.4.0系统。虽然干上去HarmonyOS.4.0系统目前BUG非常多&#xff0c;根本…

数仓主题域和数据域、雪花模型,星型模型和星座模型

数仓模型和领域划分 一、主题域和数据域的差别二、雪花模型&#xff0c;星座模型和星型模型 一、主题域和数据域的差别 明确数据域作为数仓搭建的重要一环&#xff0c;能够让数仓的数据便于管理和应用。 数据域和主题域都是数据仓库中的重要概念&#xff0c;但含义略有不同&am…

【Pinia】Pinia的概念、优势及使用方式

学习公司的项目&#xff0c;发现用到了Pinia&#xff0c;于是上网学习了一下&#xff0c;发现了一篇比较优秀的文章&#xff0c;于是将极少部分放到此记录学习&#xff0c;原文链接在末尾。 是什么 官网解释&#xff1a; Pinia 是 Vue 的存储库&#xff0c;它允许您跨组件/页…

2023年中国场馆产业研究报告

第一章 行业综述 1.1 定义与分类 场馆&#xff0c;作为一个多元化和充满活力的行业&#xff0c;为人们提供了一个为不同目的而聚集的空间。无论是为了活动、表演、展览还是聚会&#xff0c;场馆都在为社区的社会、文化和经济建设做出了不可或缺的贡献。 场馆是一个为举办各类…

VR全景展示的功能有哪些?你了解多少?

VR全景展示作为一种全新的视觉体验技术&#xff0c;能够为人们带来强烈的视觉效果以及沉浸式的观感&#xff0c;在旅游、房地产、车展、博物馆等都有着十分广泛的应用。这种富媒体技术&#xff0c;具有很好的交互性和沉浸感&#xff0c;能够带给大家更好的体验&#xff0c;那么…

uni-app实现web-view图片长按下载

<template><view><web-view :webview-styles"webviewStyles" :src"webUrl"></web-view></view> </template> uniapp的web-view中图片无法长按保存&#xff0c;IOS下是正常的&#xff0c;但是Android下长按无反应 解…