我的编程空间,编程开发者的网络收藏夹
学习永远不晚

c++中vector模拟实现的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

c++中vector模拟实现的示例分析

这篇文章将为大家详细讲解有关c++中vector模拟实现的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、vector是什么?

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

二、容器特性

顺序序列

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

动态数组

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

能够感知内存分配器的

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

三、vector的模拟实现

定义一个类:

template<class T>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 &gt; 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 ? 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 < size())            return _start[pos];    }

operator= 重载

Vector<T>& operator=(const Vector<T>& v)    {        if (this != &v)        {            delete[]_start;            size_t n = v.capacity();            _start = new T[n];            for (size_t i = 0; i < v.capacity(); ++i)            {                _start[i] = v._start[i];            }            _finish = _start + v.size();            _finish = _start + n;        }        return *this;    }

迭代器

//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模拟实现的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

c++中vector模拟实现的示例分析

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

下载Word文档

猜你喜欢

c++中vector模拟实现的示例分析

这篇文章将为大家详细讲解有关c++中vector模拟实现的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、vector是什么?vector是表示可变大小数组的序列容器,它也采用连续存储空间来存储
2023-06-14

C++中STL vector的模拟实现示例

这篇文章主要介绍C++中STL vector的模拟实现示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. vector的介绍和使用vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存
2023-06-14

C++模拟实现vector代码分析

本篇内容主要讲解“C++模拟实现vector代码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++模拟实现vector代码分析”吧!vector的模拟实现#include
2023-07-05

C++模拟实现vector示例代码图文讲解

这篇文章主要介绍了C++容器Vector的模拟实现,Vector是一个能够存放任意类型的动态数组,有点类似数组,是一个连续地址空间,下文更多详细内容的介绍,需要的小伙伴可以参考一下
2023-02-27

C++中如何模拟实现vector

这篇文章给大家分享的是有关C++中如何模拟实现vector的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。vector接口总览namespace nzb{//模拟实现vectortemplatec
2023-06-25

c++ vector对象的示例分析

这篇文章主要介绍c++ vector对象的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!vector对象  为什么需要vector?封装任何类型的动态数组,自动创建和删除。数组下标越界检查。封装的如Array
2023-06-06

C语言中vector底层实现机制的示例分析

这篇文章给大家分享的是有关C语言中vector底层实现机制的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、vector底层实现机制刨析通过分析 vector 容器的源代码不难发现,它就是使用 3 个迭
2023-06-25

C++模拟实现vector的方法

今天小编给大家分享一下C++模拟实现vector的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 模拟实现vecto
2023-07-02

C++ STL容器中红黑树部分模拟实现的示例分析

这篇文章主要介绍了C++ STL容器中红黑树部分模拟实现的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、红黑树的概念红黑树(Red Black Tree),是在计
2023-06-21

C++ vector的底层实现分析

这篇文章主要介绍“C++ vector的底层实现分析”,在日常操作中,相信很多人在C++ vector的底层实现分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++ vector的底层实现分析”的疑惑有所
2023-06-25

详解C++中vector的理解以及模拟实现

vector是表示可变大小数组的序列容器。这篇文章主要为大家详细介绍了vector的理解以及模拟实现,文中的示例代码讲解详细,感兴趣的可以了解一下
2023-03-08

Linux下模拟实现进度条的示例分析

这篇文章将为大家详细讲解有关Linux下模拟实现进度条的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux下模拟实现进度条 在Linux系统下模拟进度条,首先需要了解一些简单基础知识:
2023-06-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录