热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

c++vector模拟实现的全过程

这篇文章主要给大家介绍了关于c++vector的模拟实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、vector是什么?

vector是表示可变大小数组的序列容器,它也采用连续存储空间来存储元素,因此可以采用下标对vector的元素进行访问,它的大小是动态改变的,vector使用动态分配数组来存储它的元素;

二、容器特性

1.顺序序列

顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素;

2.动态数组

支持对序列中的任意元素进行快速直接访问,甚至可以通过指针进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作;

3.能够感知内存分配器的

容器使用一个内存分配器对象来动态地处理它的存储需求;

三、vector的模拟实现

定义一个类:

template
class Vector
{
    T* _start; //首元素地址
    T* _finish; //最后一个元素地址的下一个地址
    T* _endOfStorage; //空间的尾地址
public:
//成员函数
};

构造函数

Vector()
    :_start(nullptr)
    , _finish(nullptr)
    , _endOfStorage(nullptr)
{}

Vector(size_t n, const T& value = T())
    :_start(nullptr)
    , _finish(nullptr)
    , _endOfStorage(nullptr)
{
    reserve(n);
    while (n--)
    {
        push_back(value);
    }
}
Vector(InputInterator first, InputInterator last)
        :_start(nullptr)
        , _finish(nullptr)
        , _endOfStorage(nullptr)
    {
        while (first != last)
        {
            pushBack(*first);
            ++first;
        }
    }

数据大小、空间大小

size_t size() const
{
    return _finish - _start;
}

size_t capacity() const
{
    return _endOfStorage - _start;
}

尾插

void pushBack(const T& value)
    {
        if (_finish == _endOfStorage)
        {
            size_t newC = _endOfStorage == nullptr ? 1 : 2 * capacity();
            reverse(value);
        }
        *_finish = value;   
        ++_finish;
    }

扩容

有资源进行拷贝时,使用深拷贝;类型为自定义类型时,发生浅拷贝,调用自定义类型析构函数,释放资源,导致资源二次释放,所以自定义类型的拷贝有资源时进行深拷贝;

深拷贝与浅拷贝的区别及应用

void reserve(size_t n)
{
if (n > capacity())
{
size_t sz = size();
T* arr = new T[n];
if (_start)
{
memcpy(arr, _start, sizeof(T) * sz);
delete[] _start;
}
//update
_start = arr;
_finish = _start + sz;
_endOfStorage = _start + n;
}
}

改变数据大小

void resize(size_t n, const T& val = T())
    {
        if (n > capacity())
        {
            reserve(n);
        }
        else if (n > size())
        {
            while (_finish != _start + n)
            {
                *_finish = val;
                _finish++;
            }
        }
            _finish = _start + n;
    }

位置插入值

void insert(iterator pos, const T& val)
    {
        size_t sz = pos - _start;
        //检查位置
        if (pos >= _start && pos <= _finish)
        {
            //检查容量
            if (_finish == _endOfStoage)
            {
                size_t n = _endOfStorage == nullptr &#63; 1 : 2 * capacity();               
                reserve(n);
                //更新迭代器
                pos = _start + sz;
            }
            //移动元素
            iterator end_u = _finish;
            while (end_u != pos)
            {
                *end = *(end_u - 1);
                --end_u();
            }
            //插入元素
            *pos = val;
            //更新位置
            ++_finish;
        }
    }

删除数据

iterator erase(iterator pos)
    {
        //检查位置
        if (pos <_finish && pos >= _start)
        {
            //移动元素
            iterator start = pos + 1;
            while (start!=_finish)
            {
                *(start - 1) = *start;
                start++;
            }
            //更新
            --_finish;
        }
        return pos;
    }
    //返回删除数据的下一个元素的位置

operator[] 重载

T& operator[](size_t pos)
    {
        if (pos >= 0 && pos 

operator= 重载

    Vector& operator=(const Vector& v)
    {
        if (this != &v)
        {
            delete[]_start;
            size_t n = v.capacity();
            _start = new T[n];
            for (size_t i = 0; i 

迭代器

//vector迭代器:T*
typedef T* iterator;
typedef const T* const_iterator;

iterator begin()
{
    return _start;
}

iterator end()
{
    return _finish;
}

const_iterator begin() const
{
    return _start;
}

const_iterator end() const
{
    return _finish;
}

析构函数

~Vector()
{
    if (_start)
    {
        delete[] _start;
        _start = _finish = _endOfStorage = nullptr;
    }
}

总结

到此这篇关于c++ vector模拟实现的文章就介绍到这了,更多相关c++ vector模拟实现内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • Eclipse 中 JSP 开发环境配置指南
    本文详细介绍了如何在 Eclipse 集成开发环境中配置 JSP 运行环境,包括必要的软件下载、Tomcat 服务器的配置以及常见问题的解决方法。 ... [详细]
  • 本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
  • 容器与微服务基础:快速入门指南
    探索容器和微服务的基础知识,了解如何通过先进的应用性能管理(APM)工具提升监控效能。加入AppDynamics APM的导览,掌握容器与微服务实施及监控的最佳实践。 ... [详细]
  • Docker 自定义网络配置详解
    本文详细介绍如何在 Docker 中自定义网络设置,包括网关和子网地址的配置。通过具体示例展示如何创建和管理自定义网络,以及容器间的通信方式。 ... [详细]
  • 深入理解Docker网络管理
    本文介绍了Docker网络管理的基本概念,包括为什么需要Docker网络管理以及Docker提供的多种网络驱动模式。同时,文章还详细解释了Docker网络相关的命令操作,帮助读者更好地理解和使用Docker网络功能。 ... [详细]
  • Matlab 实现工程与科学问题 - 第三章个人解析
    作为一名在读大学生,本文分享了我对《工程与科学中的Matlab应用》第三章习题的个人解决方案。欢迎通过私信或评论进行交流和讨论,但不接受任何形式的权威指导。文中提供了详细的代码实现,旨在促进学习和共同进步。 ... [详细]
  • 本文档详细介绍了在 Kubernetes 集群中部署 ETCD 数据库的过程,包括实验环境的准备、ETCD 证书的生成及配置、以及集群的启动与健康检查等关键步骤。 ... [详细]
  • 热璞数据库与云宏达成兼容性互认证,共筑数据安全屏障
    热璞数据库与云宏信息技术有限公司近期宣布完成产品兼容性互认证,旨在提升数据安全性与稳定性,支持企业数字化转型。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • 前言Git是目前最流行的版本控制系统,在它的基础之上,GitHub和GitLab成为当前最流行的代码托管平台,它们均提供的代码评审、项目管理、持续集成等功能,越来越多的互联网企业都 ... [详细]
  • Flowable 6.6.0 表单引擎在Web应用中的集成与使用
    本文档提供了Flowable 6.6.0版本中表单引擎在Web应用程序中的配置和使用指南,包括表单引擎的初始化、配置以及在Web环境下的具体实现方法。 ... [详细]
  • Eclipse 下 JavaFX 程序开发指南
    本文介绍了 JavaFX,这是一个用于创建富客户端应用程序的 Java 图形和媒体工具包,并详细说明了如何在 Eclipse 环境中配置和开发 JavaFX 应用。 ... [详细]
  • 精通C++并非易事,为何它比其他语言更难掌握?这主要归因于C++的设计理念,即不强迫用户接受特定的编程风格或限制创新思维。本文探讨了如何有效学习C++,并介绍了几本权威的学习资源。 ... [详细]
author-avatar
王尼玛的脑残粉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有