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

C++初阶(十四)list

在这里插入图片描述


📘北尘_:个人主页

🌎个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》

☀️走在路上,不忘来时的初心

文章目录

  • 一、 list的介绍
  • 二、list的模拟实现
    • 1、list的节点
    • 2、list 的迭代器
    • 3、list
    • 4、打印
    • 5、完整代码


一、 list的介绍

  1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
  3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。
  4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
  5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)

在这里插入图片描述


二、list的模拟实现

1、list的节点

template<class T>struct list_node{T _data;list_node<T>* _prev;list_node<T>* _next;list_node(const T& x = T()):_data(x), _next(nullptr), _prev(nullptr){}};

2、list 的迭代器

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){}self& operator++(){_node = _node->_next;return *this;}self& operator--(){_node = _node->_prev;return *this;}self operator++(int){self tmp(*this);_node = _node->_next;return tmp;}self operator--(int){self tmp(*this);_node = _node->_prev;return tmp;}Ref operator*(){return _node->_data;}Ptr operator->(){return &_node->_data;}bool operator!=(const self& s){return _node != s._node;}bool operator==(const self& s){return _node == s._node;}};

3、list

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;iterator begin(){return _head->_next;}iterator end(){return _head;}const_iterator begin() const{return _head->_next;}const_iterator end() const{return _head;}void empty_init(){_head = new Node;_head->_next = _head;_head->_prev = _head;_size = 0;}list(){empty_init();}list(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(_size, lt._size);std::swap(_head, lt._head);}iterator insert(iterator pos, const T& x){Node* cur = pos._node;Node* newnode = new Node(x);Node* prev = cur->_prev;prev->_next = newnode;newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;++_size;return iterator(newnode);}iterator erase(iterator pos){Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;delete cur;prev->_next = next;next->_prev = prev;--_size;}size_t size(){return _size;}void clear(){iterator it = begin();while (it != end){it = erase(it);}}void push_back(const T& x){insert(end(), x);}void push_front(const T& x){insert(begin(), x);}void push_back(){erase(end());}void pop_back(){erase(begin());}private:Node* _head;size_t _size;};

4、打印

template<typename Container>void print_container(const Container& con){typename Container::const_iterator it = con.begin();while (it != con.end()){cout << *it << " ";++it;}cout << endl;}void test_list(){list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);print_container(lt);list<string> lt1;lt1.push_back("1111111111111");lt1.push_back("1111111111111");lt1.push_back("1111111111111");lt1.push_back("1111111111111");lt1.push_back("1111111111111");print_container(lt1);vector<string> v;v.push_back("222222222222222222222");v.push_back("222222222222222222222");v.push_back("222222222222222222222");v.push_back("222222222222222222222");print_container(v);}
}
int main()
{bit::test_list();return 0;
}

5、完整代码

#include<iostream>
#include<string>
#include<vector>
using namespace std;
namespace bit
{template<class T>struct list_node{T _data;list_node<T>* _prev;list_node<T>* _next;list_node(const T& x = T()):_data(x), _next(nullptr), _prev(nullptr){}};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){}self& operator++(){_node = _node->_next;return *this;}self& operator--(){_node = _node->_prev;return *this;}self operator++(int){self tmp(*this);_node = _node->_next;return tmp;}self operator--(int){self tmp(*this);_node = _node->_prev;return tmp;}Ref operator*(){return _node->_data;}Ptr operator->(){return &_node->_data;}bool operator!=(const self& s){return _node != s._node;}bool operator==(const self& s){return _node == s._node;}};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;iterator begin(){return _head->_next;}iterator end(){return _head;}const_iterator begin() const{return _head->_next;}const_iterator end() const{return _head;}void empty_init(){_head = new Node;_head->_next = _head;_head->_prev = _head;_size = 0;}list(){empty_init();}list(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(_size, lt._size);std::swap(_head, lt._head);}iterator insert(iterator pos, const T& x){Node* cur = pos._node;Node* newnode = new Node(x);Node* prev = cur->_prev;prev->_next = newnode;newnode->_prev = prev;newnode->_next = cur;cur->_prev = newnode;++_size;return iterator(newnode);}iterator erase(iterator pos){Node* cur = pos._node;Node* prev = cur->_prev;Node* next = cur->_next;delete cur;prev->_next = next;next->_prev = prev;--_size;}size_t size(){return _size;}void clear(){iterator it = begin();while (it != end){it = erase(it);}}void push_back(const T& x){insert(end(), x);}void push_front(const T& x){insert(begin(), x);}void push_back(){erase(end());}void pop_back(){erase(begin());}private:Node* _head;size_t _size;};template<typename Container>void print_container(const Container& con){typename Container::const_iterator it = con.begin();while (it != con.end()){cout << *it << " ";++it;}cout << endl;}void test_list(){list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_back(5);print_container(lt);list<string> lt1;lt1.push_back("1111111111111");lt1.push_back("1111111111111");lt1.push_back("1111111111111");lt1.push_back("1111111111111");lt1.push_back("1111111111111");print_container(lt1);vector<string> v;v.push_back("222222222222222222222");v.push_back("222222222222222222222");v.push_back("222222222222222222222");v.push_back("222222222222222222222");print_container(v);}
}
int main()
{bit::test_list();return 0;
}

在这里插入图片描述


相关文章:

  • [论文阅读]BEVFusion
  • Spring Boot 优雅地处理重复请求
  • Java IO流(五)(字符集基础知识简介)
  • 【3】密评-物理和环境安全测评
  • 分布式分布式事务分布式锁分布式ID
  • 1688API接口系列,商品详情数据丨搜索商品列表丨商家订单类丨1688开放平台接口使用方案
  • SQL语言重温
  • 安全快速地删除 MySQL 大表数据并释放空间
  • 忘记PDF密码了,怎么办?
  • 【计算机网络第一章知识点总结】 - - - 我为何钟情于计算机:一段有趣的选择之旅
  • 分布式环境下的session 共享-基于spring-session组件和Redis实现
  • openGauss学习笔记-150 openGauss 数据库运维-备份与恢复-物理备份与恢复之gs_backup
  • ES6中的继承,String类型方法的拓展
  • 【软考中级——软件设计师】备战经验 笔记总结分享
  • uniApp项目的创建,运行到小程序
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 2017届校招提前批面试回顾
  • gitlab-ci配置详解(一)
  • isset在php5.6-和php7.0+的一些差异
  • JavaScript对象详解
  • Java多线程(4):使用线程池执行定时任务
  • java中的hashCode
  • leetcode-27. Remove Element
  • passportjs 源码分析
  • PHP那些事儿
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Vue2.0 实现互斥
  • 基于游标的分页接口实现
  • 深入 Nginx 之配置篇
  • 使用docker-compose进行多节点部署
  • 一份游戏开发学习路线
  • ​Linux·i2c驱动架构​
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #NOIP 2014#Day.2 T3 解方程
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (ibm)Java 语言的 XPath API
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (十一)c52学习之旅-动态数码管
  • .Net mvc总结
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .stream().map与.stream().flatMap的使用
  • /etc/fstab 只读无法修改的解决办法
  • ::什么意思
  • @Transactional 详解
  • [30期] 我的学习方法
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [BUUCTF]-Reverse:reverse3解析
  • [C#]winform部署yolov5-onnx模型
  • [C++]AVL树怎么转
  • [C++]运行时,如何确保一个对象是只读的
  • [codevs 2822] 爱在心中 【tarjan 算法】
  • [G-CS-MR.PS02] 機巧之形2: Ruler Circle