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.hqwc.cn/news/111866.html

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

相关文章

【新版】系统架构设计师 - 软件架构设计<新版>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 软件架构设计&#xff1c;新版&#xff1e;考点摘要概念架构的 4 1 视图架构描述语言ADL基于架构的软件开发方法ABSDABSD的开发模型ABSDMABSD&#xff08;ABSDM模型&#xff09;的开发过程 软件架…

思维导图怎么画好看又简单?看看这个方法

思维导图怎么画好看又简单&#xff1f;思维导图是一种非常有用的工具&#xff0c;可以帮助我们组织和展示思维。如果你想要画出既好看又简单的思维导图&#xff0c;那么我们可以使用一些思维导图制作工具。下面就给大家介绍一款个人觉得很好用的思维导图制作工具。 【迅捷画图】…

金蝶云星空各种部署架构及适用场景分享

> 随着公司的快速发展上市到进入世界500强&#xff0c;作为技术经理&#xff0c;负责了金蝶云星空从单点部署到集群&#xff0c;再到替换SAP的过程&#xff0c;如今项目已经成功上线&#xff0c;所以对金蝶的相关知识也做下整理和归档。 > 在项目实施过程中&#xff0c;部…

Java实现图书管理系统

一、分析有主要对象 二、整理思路 三、框架的搭建 四、操作内部的具体实现 一、分析主要对象 我们做的图书管理系统的目的&#xff0c;是可以根据不同的用户&#xff0c;所能执行的操作不一样&#xff0c;主要有增删查改图书等操作&#xff0c;选择这些不同的操作会给我们反…

php预约系统源码 网上预约小程序开发源码 整套系统搭建让在线预约更便捷

随着互联网技术的发展&#xff0c;越来越多的服务行业开始通过网上预约系统来实现便捷的客户管理和服务提供。PHP预约系统源码作为一种成熟的技术方案&#xff0c;可以帮助商家快速搭建自己的预约系统&#xff0c;提高工作效率&#xff0c;优化客户体验。 分享一个php预约系统…

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

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

Chatbot到底提供了哪些便利?来看看“中文版Chatbase”

Chatbot的出现可以说是在极大的程度上改变了企业与客户互动的方式。Chatbot凭借其先进的功能和全天候可用性提供了一系列便捷的功能&#xff0c;为企业和客户提供便利和高效。随着自然语言处理和机器学习算法的进步&#xff0c;Chatbot已经发展到可以提供准确和个性化的响应&am…

Python数据库编程:连接、操作和管理数据库

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Python作为一门多用途的…

GLSL ES着色器 精度限定字

目录 前言 WebGL支持的三种精度 数据类型的默认精度 float类型没有默认精度 预处理指令 在GLSL ES中常用的三种预处理指令。 预定义的内置宏 前言 GLSL ES新引入了精度限定字&#xff0c;目的是帮助着色器程序提高运行效率&#xff0c;削减内存开支。顾名思义&#xf…

K8S:Yaml文件详解及编写示例

文章目录 一.Yaml文件详解1.Yaml文件格式2.YAML 语法格式 二.Yaml文件编写及相关概念1.查看 api 资源版本标签2.yaml编写案例&#xff08;1&#xff09;相关标签介绍&#xff08;2&#xff09;Deployment类型编写nginx服务&#xff08;3&#xff09;k8s集群中的port介绍&#x…

Matlab图像处理-HSI模型

HSI模型 HSI模型是从人的视觉系统出发&#xff0c;直接使用颜色三要素色调(Hue)、饱和度(Saturation)和亮度&#xff08;Intensity&#xff09;来描述颜色。 亮度是指人眼感知光线的明暗程度。光的能量越大&#xff0c;亮度就越大。 色调是颜色最重要的属性。 它决定了颜色的…

R语言绘图-3-Circular-barplot图

0. 参考&#xff1a; https://r-graph-gallery.com/web-circular-barplot-with-R-and-ggplot2.html 1. 说明&#xff1a; 利用 ggplot 绘制 环状的条形图 (circular barplot)&#xff0c;并且每个条带按照数值大小进行排列。 2 绘图代码: 注意&#xff1a;绘图代码中的字体…