码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【C++】--模拟实现vector


    文章目录

    • Constructors(构造函数)
      • myvector()
      • myvector(int n, const T& val = T())
      • myvector(InputIterator first, InputIterator last)
      • 拷贝构造
      • 交换函数
      • myvector< T >& operator=(myvector< T > v)
    • 迭代器
    • 扩容
      • reserve
    • resize
    • 插入和删除
      • push_back
      • pop_back
      • insert
      • erase
    • 全代码
    • 总结

    vector和我们学数据结构时候的顺序表差不多,不过STL库里面的vector给我们提供了很多的接口函数,十分方便。对于各接口的调用这里就不详细讲解了,用到的时候不熟悉可以去官网查一下。这篇文章主要讲讲 个人对vector模拟实现的方法

    image-20221124160305301

    Constructors(构造函数)

    vector是一个模板类,可以存储不同类型的数据。先来看看官方的几种构造法方法

    image-20221124160734864

    因为vector是一个模板类,所以在定义类时要用模板的格式。在vector中可以简单的定义三个类变量,全部用模板类型的指针类型

    iterator _start;//首地址
    iterator _finish;//最后一位有效数据的后一位地址
    iterator _endofstorage;//容量的最后一位地址

    template<class T>
    	class myvector {
       
    	public:
    		typedef T* iterator;
    		typedef const T* const_iterator;
            
    	private:
    		iterator _start;//首地址
    		iterator _finish;//最后一位有效数据地址
    		iterator _endofstorage;//容量的最后一位地址
    	};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    myvector()

    定义好变量后,先实现一个无参的构造函数。因为变量都是指针类型,所以一开始我们可以将它们初始化为nullptr

    myvector()
        :_start(nullptr)
        , _finish(nullptr)
        ,_endofstorage(nullptr)
    {
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    myvector(int n, const T& val = T())

    再来实现一个跟库里面一样的,可以指定对象开辟的空间大小,并把指定值填入每一个空间中

    myvector(int n, const T& val = T()) 
        :_start(nullptr)
        , _finish(nullptr)
        , _endofstorage(nullptr)
    {
       
        reserve(n);
        for (int i = 0; i < n; i++)
        push_back(val);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    push_back的实现下面再将。

    注意:这个的缺省值不能用0或者" ",因为类型T没有确定,有可能会是我们自定义的类型,所以缺省值要使用T类型的默认初始值。参数中的n为什么不用size_t类型呢,下面会谈到

    myvector(InputIterator first, InputIterator last)

    接下来库里面的第三个构造函数,指定一段区间,并将这段区间的所有数值赋值到对象中。因为是一段区间,所以参数传的是指针,但是由于类型没有确定,所以要使用模板函数

    template <class InputIterator>
    myvector(InputIterator first, InputIterator last)
        :_start(nullptr)
        , _finish(nullptr)
        , _endofstorage(nullptr)
    {
       
        while (first != last) {
       
            push_back(*first);
            first++;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    为什么上面讲的第二个构造不使用size_t类型呢,就是因为第三个区间的构造传的参数是指针类型,如果第二个参数使用的是size_t类型,那么当我们构造传参时,编译器就不知道去匹配哪一个构造函数了。所以为了避免冲突,第二个构造我们使用int类型参数。

    拷贝构造

    接下来实现拷贝构造函数,因为有了上面的区间构造函数后,我们只需要创建一个临时的对象,然后和原对象交换一下后就可以了。需要注意的是,交换的时候要将地址交换才不会出现野指针的情况

    myvector(const myvector<T>& v)
        :_start(nullptr)
        , _finish(nullptr)
        , _endofstorage(nullptr)
    {
       
        myvector<int> tmp(v.begin(), v.end());
        swap(tmp);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    交换函数

    交换地址就可以直接实现了

    void swap(myvector<T>& v) {
       
        std::swap(_start, v._start);
        std::swap
    • 1
    • 2
    • 3
  • 相关阅读:
    Other——电子产品的零售版本和OEM版本
    (原创)【B4A】一步一步入门09:xCustomListView,加强版列表、双行带图片、复选框按钮等自定义列表项(控件篇05)
    文心一言 VS 讯飞星火 VS chatgpt (99)-- 算法导论9.3 5题
    三分钟搞懂MySQL5.6优化&索引下推
    基于Docker-compose搭建LNMP
    使用Spring Boot + MyBatis实现多数据源
    计算机算法分析与设计(20)---回溯法(0-1背包问题)
    前端通过range控制的rgba配色小工具
    springboot+vue+nodejs游戏资讯攻略分享网站java
    为什么力扣中std::sort的cmp函数不加static会出错?
  • 原文地址:https://blog.csdn.net/weixin_52563203/article/details/128028126
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号