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


这篇文章主要介绍了怎么用C++模拟实现STL容器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用C++模拟实现STL容器文章都会有所收获,下面我们一起来看看吧。列表是一种顺序容器,它允许在序列中的任何位置执行常量时间插入和删除操作,并允许在两个方向上进行迭代。它的底层是一个带头双向循环链表。list不能用算法库的sort进行排序。算法库中的sort的底层是一个快排,需满足三数取中,需要传入随机访问迭代器,所以list并不适用。当然list中提供了一个自己的sort,它的底层是一个归并排序。但是这个sort比vector使用算法库的sort还慢,甚至比list的数据先push_back到vector到再用算法库的sort还要慢。insert,迭代器不失效earse失效1、单向迭代器:只能++,不能–。例如单链表,哈希表;2、双向迭代器:既能++也能–。例如双向链表;3、随机访问迭代器:能++–,也能+和-。例如vector和string。迭代器是内嵌类型(内部类或定义在类里)普通迭代器迭代器的实现需要支持解引用(为了取数据),支持++–。博主模拟实现string和vector时,直接将原生指针typedef成迭代器,是因为数组的结构正好满足迭代器的行为(注:string和vector可以用原生指针实现,但是vs中采用自定义类型封装的方式实现),但是list中的节点地址是不连续的,不能使用原生指针,需要使用类进行封装+运算符重载实免费云主机域名现。const迭代器const迭代器的错误写法:因为typedef后,const修饰的是迭代器it,只能调用operator*(),调不了operator++()。(重载operator++()为const operator++()也不行,因为const版本++还是改变不了)正确写法:想实现const迭代器,不能在同一个类里面动脑筋,需要再写一个const版本迭代器的类。当然,这样写__list_iterator和__list_const_iterator这两个类会出现代码重复。STL库中是通过类模板多给一个参数来实现,这样,同一份类模板就可以生成两种不同的类型的迭代器(以下为仿STL库的模拟实现):1、封装底层实现,不暴露底层实现的细节;2、多种容器提供统一的访问方式,降低使用成本;C语言没有运算符重载和引用等语法,是实现不了迭代器的。迭代器的用法就是模拟指针的行为,如果现在有一个指向结构的指针,那么就需要用到->来解引用。但是operator->使用T*做返回值类型,这样无论是普通迭代器和const迭代器都能修改,所以operator->的返回值类型应该改为泛型:1、调用拷贝构造时,链表内节点数据为什么已经是深拷贝了?2、类名和类型的区别普通类:类名等于类型类模板:类名不等价于类型,例如list类模板类名是list,类型list等。所以我们平常写函数形参和返回值时,总会带上形参和返回值的类型:但是C++在类模板里面可以用类名代替类型:建议写代码的时候严格区分类型和类名,让自己和别人能够看的很明白。(了解下C++有这种坑语法即可)vector和list像左右手一样,是互补关系,缺一不可。vector的优点正是list的缺点,list的优点也是vector的缺点,实际选用容器时,按照需求择优选用。vector的优点(结构厉害):1、支持下标的随机访问;2、尾插尾删效率高(当然扩容的那一次尾插尾删会较慢);3、CPU高速缓存命中高(数据从缓存加载至CPU中,会加载连续的一段数据,vector因为结构连续,高速缓存命中高)。vector的缺点:1、非尾插尾删效率低;2、扩容有消耗,并存在一定的空间浪费。vector迭代器失效问题:insert/erase均失效。(如果string的insert和erase形参是迭代器,那么也会失效,但是大部分接口是下标传参,不考虑失效问题,只有几个接口是迭代器传参,需要注意迭代器失效问题)list的优点:1、按需申请释放,无需扩容;2、任意位置插入删除时间O(1);(这里说的是插入删除,不要加上查找的时间)list的缺点:1、不支持下标的随机访问;2、CPU高速缓存命中率低;3、每一个节点除了存储数据外,还需要额外存储两个指针。list迭代器失效问题:insert不失效,erase失效。关于“怎么用C++模拟实现STL容器”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用C++模拟实现STL容器”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。

相关推荐: C++分支和循环语句怎么使用

本篇内容介绍了“C++分支和循环语句怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!生活中存在三种语言结构(1)顺序结构(2)选择结构分支语句:if sw…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 02/25 22:55
Next 02/25 22:57

相关推荐