iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么用C++模拟实现STL容器
  • 587
分享到

怎么用C++模拟实现STL容器

2023-07-04 18:07:32 587人浏览 泡泡鱼
摘要

这篇文章主要介绍了怎么用c++模拟实现STL容器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用C++模拟实现STL容器文章都会有所收获,下面我们一起来看看吧。一、list的介绍列表是一种顺序容器,它允许在

这篇文章主要介绍了怎么用c++模拟实现STL容器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用C++模拟实现STL容器文章都会有所收获,下面我们一起来看看吧。

    一、list的介绍

    列表是一种顺序容器,它允许在序列中的任何位置执行常量时间插入和删除操作,并允许在两个方向上进行迭代。它的底层是一个带头双向循环链表

    二、list的排序

    list不能用算法库的sort进行排序。算法库中的sort的底层是一个快排,需满足三数取中,需要传入随机访问迭代器,所以list并不适用。

    当然list中提供了一个自己的sort,它的底层是一个归并排序。但是这个sort比vector使用算法库的sort还慢,甚至比list的数据先push_back到vector到再用算法库的sort还要慢。

    怎么用C++模拟实现STL容器

    三、迭代器

    1、list的迭代器失效问题

    insert,迭代器不失效

    earse失效

    2、迭代器的功能分类

    单向迭代器:只能++,不能--。例如单链表,哈希表;

    双向迭代器:既能++也能--。例如双向链表;

    随机访问迭代器:能++--,也能+和-。例如vector和string。

    迭代器是内嵌类型(内部类或定义在类里)

    3、list迭代器的模拟实现

    普通迭代器

    迭代器的实现需要支持解引用(为了取数据),支持++--。

    博主模拟实现string和vector时,直接将原生指针typedef成迭代器,是因为数组的结构正好满足迭代器的行为(注:string和vector可以用原生指针实现,但是vs中采用自定义类型封装的方式实现),但是list中的节点地址是不连续的,不能使用原生指针,需要使用类进行封装+运算符重载实现。

    //用类封装迭代器template <class T>struct __list_iterator{    typedef list_node<T> node;    //用节点的指针进行构造    __list_iterator(node* p)        :_pnode(p)    {}    //迭代器运算符的重载    T& operator*()    {        return _pnode->_data;    }    __list_iterator<T>& operator++()//返回值不要写成node* operator++(),因为迭代器++肯定返回迭代器啊,你返回节点指针类型不对    {         //return _pnode->_next;        _pnode=_pnode->_next;        return *this;//返回的是迭代器    }    bool operator!=(const __list_iterator<T>& it)    {        return _pnode != it._pnode;    }public:    node* _pnode;//封装一个节点的指针};

    怎么用C++模拟实现STL容器

    const迭代器

    const迭代器的错误写法:

    typedef __list_iterator<T> iterator;const list<T>::iterator it=lt.begin();

    因为typedef后,const修饰的是迭代器it,只能调用operator*(),调不了operator++()。(重载operator++()为const operator++()也不行,因为const版本++还是改变不了)

    正确写法:想实现const迭代器,不能在同一个类里面动脑筋,需要再写一个const版本迭代器的类。

    //用类封装const迭代器template <class T>struct __list_const_iterator{    typedef list_node<T> node;    //用节点的指针进行构造    __list_const_iterator(node* p)        :_pnode(p)    {}    //迭代器运算符的重载    const T& operator*()const    {        return _pnode->_data;    }    __list_const_iterator<T>& operator++()//返回值不要写成node*,因为迭代器++肯定返回迭代器啊,你返回节点指针类型不对    {        //return _pnode->_next;//返回类型错误的        _pnode = _pnode->_next;        return *this;//返回的是迭代器    }    __list_const_iterator<T>& operator--()    {        _pnode = _pnode->_prev;        return *this;    }    bool operator!=(const __list_const_iterator<T>& it)const    {        return _pnode != it._pnode;    }public:    node* _pnode;//封装一个节点的指针}; typedef __list_const_iterator<T> const_iterator;

    当然,这样写__list_iterator和__list_const_iterator这两个类会出现代码重复。STL库中是通过类模板多给一个参数来实现,这样,同一份类模板就可以生成两种不同的类型的迭代器(以下为仿STL库的模拟实现): 

    //用类封装普通/const迭代器template <class T,class Ref>struct __list_iterator{    typedef list_node<T> node;    typedef __list_iterator<T,Ref> Self;    //用节点的指针进行构造    __list_iterator(node* p)        :_pnode(p)    {}    //迭代器运算符的重载    Ref operator*()    {        return _pnode->_data;    }    Self& operator++()//返回值不要写成node*,因为迭代器++肯定返回迭代器啊,你返回节点指针类型不对    {         //return _pnode->_next;//返回类型错误的        _pnode=_pnode->_next;        return *this;//返回的是迭代器    }    Self& operator--()    {        _pnode = _pnode->_prev;        return *this;    }    bool operator!=(const Self& it)    {        return _pnode != it._pnode;    }public:    node* _pnode;//封装一个节点的指针}; typedef __list_iterator<T, T&> iterator;typedef __list_iterator<T, const T&> const_iterator;

    4、迭代器价值

    封装底层实现,不暴露底层实现的细节;

    多种容器提供统一的访问方式,降低使用成本;

    C语言没有运算符重载和引用等语法,是实现不了迭代器的。

    5、迭代器operator->的重载

    迭代器的用法就是模拟指针的行为,如果现在有一个指向结构的指针,那么就需要用到->来解引用。

    /insert(end(), x);}void pop_back(){erase(--end());}void push_front(const T& x)//头插{insert(begin(), x);}void pop_front(){erase(begin());}iterator insert(iterator pos, const T& x){node* newNode = new node(x);node* prev = pos._pnode->_prev;node* cur = pos._pnode;newNode->_prev = prev;newNode->_next = cur;prev->_next = newNode;cur->_prev = newNode;//return iterator(newNode);pos._pnode = newNode;++_size;return pos;}iterator erase(iterator pos){assert(!empty());node* prev = pos._pnode->_prev;node* next = pos._pnode->_next;prev->_next = next;next->_prev = prev;delete pos._pnode;--_size;//return iterator(next);pos._pnode = next;return pos;}//链表小接口bool empty()const{return _head->_next == _head;}void clear(){iterator it = begin();while (it != end()){it = erase(it);//erase返回删除元素的下一个}}size_t size()const{return _size;}//普通begin(),end()迭代器iterator begin(){//return iterator(_head->_next);return __list_iterator<T, T&,T*>(_head->_next);}iterator end(){return __list_iterator<T, T&,T*>(_head);}//const begin(),end()迭代器const_iterator begin()const{//return const_iterator(_head->_next);return __list_iterator<T, const T&,const T*>(_head->_next);}const_iterator end()const{return __list_iterator<T, const T&,const T*>(_head);}private:node* _head;//哨兵位size_t _size;//用于统计节点个数,空间换时间//不加这个私有变量,统计节点个数时间O(N),有这个私有变量,时间O(1),但是每个节点的体积变大};  //测试函数struct Pos{int _row;int _col; Pos(int row = 0, int col = 0):_row(row), _col(col){}};void test(){list<Pos> i;i.push_back(Pos(1, 2));i.push_back(Pos(2, 5));i.push_back(Pos(4, 3));list<Pos>::iterator it = i.begin();while (it != i.end()){cout << (&( * it))->_row;//*it取数据,再取地址、解引用得到_row,多此一举cout << it->_row;//同第三种写法,编译器为了可读性,省略了一个->cout << it.operator->()->_row;//it.operator->()是显示调用,->_row是解引用得到_rowit++;}}void test1(){list<std::vector<int>> i;std::vector<int> v1(1, 2);std::vector<int> v2(2, 4);std::vector<int> v3(3, 5);i.push_back(v1);i.push_back(v2);i.push_back(v3);list<std::vector<int>> m(i);i = m;cout << m.size();}}

    关于“怎么用C++模拟实现STL容器”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用C++模拟实现STL容器”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网其他教程频道。

    --结束END--

    本文标题: 怎么用C++模拟实现STL容器

    本文链接: https://www.lsjlt.com/news/346736.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 怎么用C++模拟实现STL容器
      这篇文章主要介绍了怎么用C++模拟实现STL容器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用C++模拟实现STL容器文章都会有所收获,下面我们一起来看看吧。一、list的介绍列表是一种顺序容器,它允许在...
      99+
      2023-07-04
    • 利用C++模拟实现STL容器:list
      目录一、list的介绍二、list的排序三、迭代器1、list的迭代器失效问题2、迭代器的功能分类3、list迭代器的模拟实现4、迭代器价值5、迭代器operator->的重载...
      99+
      2022-12-08
      C++实现STL容器list C++ STL容器list C++ STL容器
    • C++ STL vector的模拟实现
      1. vector的介绍和使用 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对v...
      99+
      2022-11-12
    • C++  STL _ Vector使用及模拟实现
      目录1.Vector的介绍1.1 Vector的介绍2.Vector的使用2.1 vector的定义2.2 vector 迭代器的使用 2.3 vector的空间增长问题3...
      99+
      2022-11-13
    • C++ STL容器详解之红黑树部分模拟实现
      目录一、红黑树的概念二、红黑树的性质三、红黑树节点的定义四、红黑树结构 五、 红黑树的插入操作六、代码总结一、红黑树的概念 红黑树(Red Black Tree),是在计算机科学中用...
      99+
      2022-11-12
    • 详解C++STL模拟实现forward_list
      目录forward_list 概述接口总览forward_list 的节点默认成员函数默认构造函数析构函数forward_list 的迭代器构造函数operator==operato...
      99+
      2023-01-13
      C++ STL实现forward_list C++ STL forward_list
    • 详解C++ STL模拟实现list
      目录list 概述接口总览list 的节点默认成员函数默认构造函数析构函数拷贝构造函数复制赋值函数list 的迭代器构造函数operator==operator!=operator*...
      99+
      2023-01-11
      C++ STL实现list C++ STL list
    • C++ STL中容器适配器怎么实现
      这篇文章给大家分享的是有关C++ STL中容器适配器怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 stack1.1 stack 介绍 stack是一种容器适配器,专门用在具有后进先出操作的上...
      99+
      2023-06-14
    • C++如何实现STL容器
      这篇文章给大家分享的是有关C++如何实现STL容器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。各大容器的特点:可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map;特别要注意一下,v...
      99+
      2023-06-29
    • 【C++精华铺】10.STL string模拟实现
      1. 序言         STL(标准模板库)是一个C++标准库,其中包括一些通用的算法、容器和函数对象。STL的容器是C++ STL库的重要组成部分,它们提供了一种方便的方式来管理同类型的对象。其中,STLstring是一种常用的字符串...
      99+
      2023-09-11
      c++ 开发语言 stl 数据结构
    • C++中STL vector的模拟实现示例
      这篇文章主要介绍C++中STL vector的模拟实现示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. vector的介绍和使用vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存...
      99+
      2023-06-14
    • C++之list容器模拟怎么实现
      这篇“C++之list容器模拟怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++之list容器模拟怎么实现”文章吧...
      99+
      2023-07-05
    • C++ STL容器中红黑树部分模拟实现的示例分析
      这篇文章主要介绍了C++ STL容器中红黑树部分模拟实现的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、红黑树的概念红黑树(Red Black Tree...
      99+
      2023-06-21
    • C++实现STL容器的示例
      各大容器的特点: 1.可以用下标访问的容器有(既可以插入也可以赋值):vector、deque、map; 特别要注意一下,vector和deque如果没有预先指定大小,是不能用下标法...
      99+
      2022-11-13
    • C++STL容器中string类怎么用
      这篇文章将为大家详细讲解有关C++STL容器中string类怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言为什么学习string类:在C语言中,字符串是以'\0'结尾的集合,为了...
      99+
      2023-06-29
    • C++ STL中的容器适配器实现
      1 stack 1.1 stack 介绍  stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 ...
      99+
      2022-11-12
    • C++怎么使用STL迭代器和容器
      这篇“C++怎么使用STL迭代器和容器”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++怎么使用STL迭代器和容器”文章吧...
      99+
      2023-07-02
    • 关于C++STL string类的介绍及模拟实现
      目录一、标准库中的string类1.string类2.string类中的常用接口说明+模拟实现2.1 string类对象的常见构造+模拟实现 2.2 string类对象的容量操作+模...
      99+
      2022-11-12
    • C++之list容器模拟实现方式
      目录总述一、节点类二、迭代器类成员变量构造函数*重载->重载“++”“==“和”!=”三、反向迭代器类成...
      99+
      2023-02-05
      C++ list容器 list容器模拟实现 模拟实现list
    • 怎么用C++实现万花模拟器
      本篇内容介绍了“怎么用C++实现万花模拟器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!还记得小时候玩的万花尺么好好玩,各种不同的点距能画出...
      99+
      2023-06-15
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作