C++的STL简介(四)

目录

1.List

[2.list 模拟实现](#2.list 模拟实现)

2.1基本框架

[2.2 list_node](#2.2 list_node)

[2.3 list](#2.3 list)

[2.3.1 默认构造](#2.3.1 默认构造)

[2.3.2 析构函数](#2.3.2 析构函数)

[2.3.3 begin()](#2.3.3 begin())

[2.3.4 end()](#2.3.4 end())

[2.3.5 size()](#2.3.5 size())

[2.3.6 empty()](#2.3.6 empty())

[2.3.7 insert()](#2.3.7 insert())

[2.3.8 push_back()](#2.3.8 push_back())

[2.3.9 push_front()](#2.3.9 push_front())

[2.3.10 erase ()](#2.3.10 erase ())

[2.3.11 pop_back()](#2.3.11 pop_back())

[2.3.12 pop_front()](#2.3.12 pop_front())

[2.4 list_iterator](#2.4 list_iterator)

[2.4.1 - >](#2.4.1 - >)

[2.4.2 *](#2.4.2 *)

[2.4.3 前置++](#2.4.3 前置++)

[2.4.4 后置++](#2.4.4 后置++)

[2.4.5 前置--](#2.4.5 前置--)

[2.4.6 后置 --](#2.4.6 后置 --)

[2.4.7 !=](#2.4.7 !=)

[2.4.8 list_iterator完整代码](#2.4.8 list_iterator完整代码)

[2.5 list_const_iterator](#2.5 list_const_iterator)

3.整个实现完整代码


1.List

  • List是连续的容器,而vector是非连续的容器,即list将元素存储在连续的存储器中,而vector存储在不连续的存储器中。

  • 向量(vector)中间的插入和删除是非常昂贵的,因为它需要大量的时间来移动所有的元素。链表克服了这个问题,它是使用list容器实现的。

  • List支持双向,并为插入和删除操作提供了一种有效的方法。

  • 在列表中遍历速度很慢,因为列表元素是按顺序访问的,而vector支持随机访问。

2.list 模拟实现

2.1基本框架

list_node来实现每个节点,list_iterator和list_const_iterator是两个不同版本的迭代器一个是普通迭代器一个是const类型的迭代器,名字上也有所区分,list本身就有迭代器的效果,这个是为了模拟这个,重载了一些基本运算符,而list是统一管理节点,具有增删查改等效果

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cassert>
#include <algorithm> // For std::reverse

using namespace std;

namespace List
{
    // 节点类
    template<class T>
    class list_node
    {
    public:
        T _data;
        list_node<T>* _next;
        list_node<T>* _prev;

        list_node(const T& data = T())
            : _data(data)
            , _next(nullptr)
            , _prev(nullptr)
        {}
    };

//list迭代器
    template<class T>
    struct list_iterator
    {
        typedef list_node<T> Node;
        typedef list_iterator<T> Self;

        Node* _node;

        list_iterator(Node* node)
            : _node(node)
        { }

       
      
    };

//const版本迭代器
    template<class T>
    struct list_const_iterator
    {
        typedef list_node<T> Node;
        typedef list_const_iterator<T> Self;

        Node* _node;

        // 修正: list_const_iterator 的构造函数应该接受 Node* 类型
        list_const_iterator(Node* node)
            : _node(node)
        { }

    
    };
//实现list
    template<class T>
    class list
    {
        typedef list_node<T> Node;
    public:
        typedef list_iterator<T> iterator;
        typedef list_const_iterator<T> const_iterator;

        list()
        {
            _head = new Node(T());
            _head->_next = _head;
            _head->_prev = _head;
            _size = 0;
        }


        ~list()
        {
            while (!empty())
            {
                pop_front();
            }
            delete _head;
        }

    private:
        Node* _head;
        size_t _size;
    };

  
}
2.2 list_node

定义节点

cpp 复制代码
  template<class T>
  class list_node
  {
  public:
      T _data;
      list_node<T>* _next;
      list_node<T>* _prev;

      list_node(const T& data = T())
          : _data(data)
          , _next(nullptr)
          , _prev(nullptr)
      {}
  };
2.3 list

维护节点

cpp 复制代码
//实现list
    template<class T>
    class list
    {
        typedef list_node<T> Node;
    public:
        typedef list_iterator<T> iterator;
        typedef list_const_iterator<T> const_iterator;

        list()
        {
            _head = new Node(T());
            _head->_next = _head;
            _head->_prev = _head;
            _size = 0;
        }


        ~list()
        {
            while (!empty())
            {
                pop_front();
            }
            delete _head;
        }

    private:
        Node* _head;
        size_t _size;
    };
2.3.1 默认构造
cpp 复制代码
//默认构造

 list()
 {
     _head = new Node(T());
     _head->_next = _head;
     _head->_prev = _head;
     _size = 0;
 }
2.3.2 析构函数
cpp 复制代码
//析构函数

 ~list()
 {
     while (!empty())
     {
         pop_front();
     }
     delete _head;
 }
2.3.3 begin()

开始位置的迭代器

cpp 复制代码
//begin()

 iterator begin()
 {
     return iterator(_head->_next);
 }

//const 
 const_iterator begin() const
 {
     return const_iterator(_head->_next);
 }
2.3.4 end()

结尾位置的迭代器

cpp 复制代码
//普通版

 iterator end()
 {
     return iterator(_head);
 }

 //const版

 const_iterator end() const
 {
     return const_iterator(_head);
 }

 
2.3.5 size()

数据个数

cpp 复制代码
size_t size() const
 {
     return _size;
 }

 
2.3.6 empty()

判空

cpp 复制代码
bool empty() const
 {
     return _size == 0;
 }

 
2.3.7 insert()

指定位置插入

cpp 复制代码
void insert(iterator pos, const T& x)
 {
     Node* cur = pos._node;
     Node* prev = cur->_prev;
     Node* newnode = new Node(x);

     //prev newnode cur
     newnode->_next = cur;
     cur->_prev = newnode;
     newnode->_prev = prev;
     prev->_next = newnode;

     ++_size;
 }
2.3.8 push_back()

尾插

cpp 复制代码
 void push_back(const T& x)
 {
     insert(end(), x);
 }

 
2.3.9 push_front()

头插

cpp 复制代码
void push_front(const T& x)
 {
     insert(begin(), x);
 }

 
2.3.10 erase ()

指定位置删除

cpp 复制代码
void erase(iterator pos)
 {
     assert(pos != end());
     Node* prev = pos._node->_prev;
     Node* next = pos._node->_next;

     prev->_next = next;
     next->_prev = prev;
     delete pos._node;
     --_size;
 }
2.3.11 pop_back()

尾删

cpp 复制代码
 void pop_back()
 {
     erase(--end());
 }
2.3.12 pop_front()

头删

cpp 复制代码
 void pop_front()
 {
     erase(begin());
 }

2.3.13 list完整代码

cpp 复制代码
  template<class T>
  class list
  {
      typedef list_node<T> Node;
  public:
      typedef list_iterator<T> iterator;
      typedef list_const_iterator<T> const_iterator;

      list()
      {
          _head = new Node(T());
          _head->_next = _head;
          _head->_prev = _head;
          _size = 0;
      }

      iterator begin()
      {
          return iterator(_head->_next);
      }

      iterator end()
      {
          return iterator(_head);
      }

      const_iterator begin() const
      {
          return const_iterator(_head->_next);
      }

      const_iterator end() const
      {
          return const_iterator(_head);
      }

      size_t size() const
      {
          return _size;
      }

      bool empty() const
      {
          return _size == 0;
      }

      void insert(iterator pos, const T& x)
      {
          Node* cur = pos._node;
          Node* prev = cur->_prev;
          Node* newnode = new Node(x);

          //prev newnode cur
          newnode->_next = cur;
          cur->_prev = newnode;
          newnode->_prev = prev;
          prev->_next = newnode;

          ++_size;
      }

      void push_back(const T& x)
      {
          insert(end(), x);
      }

      void push_front(const T& x)
      {
          insert(begin(), x);
      }

      void erase(iterator pos)
      {
          assert(pos != end());
          Node* prev = pos._node->_prev;
          Node* next = pos._node->_next;

          prev->_next = next;
          next->_prev = prev;
          delete pos._node;
          --_size;
      }

      void pop_back()
      {
          erase(--end());
      }

      void pop_front()
      {
          erase(begin());
      }

      ~list()
      {
          while (!empty())
          {
              pop_front();
          }
          delete _head;
      }

  private:
      Node* _head;
      size_t _size;
  };
2.4 list_iterator

为了支持list迭代器效果而模拟实现了一个迭代器

cpp 复制代码
 template<class T>
 struct list_iterator
 {
     typedef list_node<T> Node;
     typedef list_iterator<T> Self;

     Node* _node;

     list_iterator(Node* node)
         : _node(node)
     { }

    
 };
2.4.1 - >
cpp 复制代码
 // 修正: 返回指向 _data 的指针,而不是引用
     T* operator->()
     {
         return &_node->_data;
     }
2.4.2 *
cpp 复制代码
     T& operator*()
     {
         return _node->_data;
     }

   
2.4.3 前置++
cpp 复制代码
  Self& operator++()
     {
         _node = _node->_next;
         return *this;
     }

   
2.4.4 后置++
cpp 复制代码
  Self operator++(int)
     {
         Self tmp(*this);
         _node = _node->_next;
         return tmp;
     }

    
2.4.5 前置--
cpp 复制代码
 Self& operator--()
     {
         _node = _node->_prev;
         return *this;
     }
2.4.6 后置 --
cpp 复制代码
     Self operator--(int)
     {
         Self tmp(*this);
         _node = _node->_prev;
         return tmp;
     }

     
2.4.7 !=
cpp 复制代码
bool operator!=(const Self& x) const
     {
         return _node != x._node;
     }
2.4.8 list_iterator完整代码
cpp 复制代码
 template<class T>
 struct list_iterator
 {
     typedef list_node<T> Node;
     typedef list_iterator<T> Self;

     Node* _node;

     list_iterator(Node* node)
         : _node(node)
     { }

     // 修正: 返回指向 _data 的指针,而不是引用
     T* operator->()
     {
         return &_node->_data;
     }

     T& 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& x) const
     {
         return _node != x._node;
     }
 };
2.5 list_const_iterator

list_const_iterator和list_iterator实现原理一致,只是有些成员函数被const修饰,typedef了const

cpp 复制代码
 template<class T>
 struct list_const_iterator
 {
     typedef list_node<T> Node;
     typedef list_const_iterator<T> Self;

     Node* _node;

     // 修正: list_const_iterator 的构造函数应该接受 Node* 类型
     list_const_iterator(Node* node)
         : _node(node)
     { }

     // 修正: 返回指向 _data 的 const 指针,而不是引用
     const T* operator->() const
     {
         return &_node->_data;
     }

     const T& operator*() const
     {
         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& x) const
     {
         return _node != x._node;
     }
 };

3.整个实现完整代码

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <cassert>
#include <algorithm> // For std::reverse

using namespace std;

namespace List
{
    // 节点类
    template<class T>
    class list_node
    {
    public:
        T _data;
        list_node<T>* _next;
        list_node<T>* _prev;

        list_node(const T& data = T())
            : _data(data)
            , _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)
        { }

        // 修正: 返回指向 _data 的指针,而不是引用
        T* operator->()
        {
            return &_node->_data;
        }

        T& 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& x) const
        {
            return _node != x._node;
        }
    };

    template<class T>
    struct list_const_iterator
    {
        typedef list_node<T> Node;
        typedef list_const_iterator<T> Self;

        Node* _node;

        // 修正: list_const_iterator 的构造函数应该接受 Node* 类型
        list_const_iterator(Node* node)
            : _node(node)
        { }

        // 修正: 返回指向 _data 的 const 指针,而不是引用
        const T* operator->() const
        {
            return &_node->_data;
        }

        const T& operator*() const
        {
            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& x) const
        {
            return _node != x._node;
        }
    };

    template<class T>
    class list
    {
        typedef list_node<T> Node;
    public:
        typedef list_iterator<T> iterator;
        typedef list_const_iterator<T> const_iterator;

        list()
        {
            _head = new Node(T());
            _head->_next = _head;
            _head->_prev = _head;
            _size = 0;
        }

        iterator begin()
        {
            return iterator(_head->_next);
        }

        iterator end()
        {
            return iterator(_head);
        }

        const_iterator begin() const
        {
            return const_iterator(_head->_next);
        }

        const_iterator end() const
        {
            return const_iterator(_head);
        }

        size_t size() const
        {
            return _size;
        }

        bool empty() const
        {
            return _size == 0;
        }

        void insert(iterator pos, const T& x)
        {
            Node* cur = pos._node;
            Node* prev = cur->_prev;
            Node* newnode = new Node(x);

            //prev newnode cur
            newnode->_next = cur;
            cur->_prev = newnode;
            newnode->_prev = prev;
            prev->_next = newnode;

            ++_size;
        }

        void push_back(const T& x)
        {
            insert(end(), x);
        }

        void push_front(const T& x)
        {
            insert(begin(), x);
        }

        void erase(iterator pos)
        {
            assert(pos != end());
            Node* prev = pos._node->_prev;
            Node* next = pos._node->_next;

            prev->_next = next;
            next->_prev = prev;
            delete pos._node;
            --_size;
        }

        void pop_back()
        {
            erase(--end());
        }

        void pop_front()
        {
            erase(begin());
        }

        ~list()
        {
            while (!empty())
            {
                pop_front();
            }
            delete _head;
        }

    private:
        Node* _head;
        size_t _size;
    };

    void test1()
    {
        list<int> lt;
        lt.push_back(1);
        lt.push_back(2);

        list<int>::iterator it = lt.begin();
        while (it != lt.end())
        {
            cout << *it << " ";
            ++it;
        }
        cout << endl;
    }
}
相关推荐
monkey_meng几秒前
【Rust中的迭代器】
开发语言·后端·rust
余衫马3 分钟前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng6 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
Jacob程序员8 分钟前
java导出word文件(手绘)
java·开发语言·word
懒大王就是我14 分钟前
C语言网络编程 -- TCP/iP协议
c语言·网络·tcp/ip
小白学大数据15 分钟前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
VBA633717 分钟前
VBA之Word应用第三章第三节:打开文档,并将文档分配给变量
开发语言
半盏茶香17 分钟前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
小堇不是码农24 分钟前
在VScode中配置C_C++环境
c语言·c++·vscode
Jack黄从零学c++26 分钟前
C++ 的异常处理详解
c++·经验分享