c++ vector模拟实现代码

yizhihongxing
  1. vector 模拟实现 —— 基本思路

Vector 是一个可以动态扩容的顺序容器,其内部使用数组存储数据。当 Vector 容量不足时,会自动扩容。通过复制当前容量大小的内存空间并将原元素复制到新的内存空间中来实现。

具体实现的过程可分为以下几个步骤:

  • 定义容器的基本特性,包括存储元素的数组地址,当前元素数量,当前容量大小。
  • 容器的初始化。初始化时分配一块指定大小的内存空间,用于存储容器的元素。
  • 容器的插入元素操作。插入元素时,首先需要判断是否需要扩容。如果需要扩容,则需要申请一块新的内存空间,并将原有元素复制到新的内存空间中。插入元素后需要更新元素数量、容量大小以及新元素在数组中的位置等属性。
  • 容器的查找元素操作。查找元素时,需要遍历整个数组,逐个比较元素的值。如果找到了指定的元素,则返回该元素的位置;否则返回一个特殊值。例如:当制定元素不存在时,返回 -1。
  • 容器的删除元素操作。删除元素时,需要将指定元素的位置从容器中移除,并从该位置开始将后面所有的元素向前移动。

  • vector 模拟实现 —— 示例说明

下面是一个简单的 vector 模拟实现代码(以 C++ 为例),代码实现了 vector 的基本功能,包括构造函数、析构函数、插入函数、查找函数、删除函数等。

#include <iostream>
using namespace std;

template<class T>
class Vector
{
private:
    T* _data;           // 指向存储元素的数组地址
    int _size;          // 当前元素数量
    int _capacity;      // 当前容量大小

public:
    // 默认构造函数
    Vector()
    {
        _size = 0;
        _capacity = 5;
        _data = new T[_capacity];
    }

    // 拷贝构造函数
    Vector(const Vector& vec)
    {
        _size = vec._size;
        _capacity = vec._capacity;
        _data = new T[_capacity];
        for (int i = 0; i < _size; i++)
        {
            _data[i] = vec._data[i];
        }
    }

    // 析构函数
    ~Vector()
    {
        _size = 0;
        _capacity = 0;
        delete[] _data;
    }

    // 获取元素数量
    int size()
    {
        return _size;
    }

    // 获取容量大小
    int capacity()
    {
        return _capacity;
    }

    // 插入元素
    void push_back(const T& value)
    {
        if (_capacity == _size)
        {
            resize(_capacity * 2);
        }
        _data[_size] = value;
        _size++;
    }

    // 查找元素
    int find(const T& value)
    {
        for (int i = 0; i < _size; i++)
        {
            if (_data[i] == value)
            {
                return i;
            }
        }
        return -1;
    }

    // 删除元素
    void erase(int pos)
    {
        if (pos >= _size || pos < 0)
        {
            return;
        }
        for (int i = pos; i < _size - 1; i++)
        {
            _data[i] = _data[i + 1];
        }
        _size--;
    }

    // 重设容器大小
    void resize(int new_capacity)
    {
        T* new_data = new T[new_capacity];
        for (int i = 0; i < _size; i++)
        {
            new_data[i] = _data[i];
        }
        delete[] _data;
        _data = new_data;
        _capacity = new_capacity;
    }

    // 打印元素
    void print()
    {
        for (int i = 0; i < _size; i++)
        {
            cout << _data[i] << " ";
        }
        cout << endl;
    }
};

// 示例一:测试插入元素和扩容
void example1()
{
    Vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(4);
    vec.push_back(5);

    // 当容器中的元素数量等于容量大小时,会自动扩容为原容量大小的两倍
    vec.push_back(6);
    vec.push_back(7);

    vec.print();    // 输出:1 2 3 4 5 6 7
}

// 示例二:测试查找元素和删除元素
void example2()
{
    Vector<int> vec;
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
    vec.push_back(4);
    vec.push_back(5);

    // 查找指定的元素
    int pos = vec.find(3);
    cout << "position: " << pos << endl;   // 输出:position: 2

    // 删除指定位置上的元素
    vec.erase(1);
    vec.print();    // 输出:1 3 4 5
}

int main()
{
    example1();
    example2();
    return 0;
}

在第一个示例中,我们插入了 7 个元素,当容器中的元素数量等于容量大小时,自动扩容为原容量大小的两倍。在第二个示例中,我们查找了一个指定的元素,并删除了指定位置上的元素。在输出时使用了容器的 print() 函数,方便观察元素的具体内容。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++ vector模拟实现代码 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • Javascript对象属性方法汇总

    Javascript对象属性方法汇总 在Javascript中,对象是一种基本数据类型,它可以用来存储数据和方法。一个对象可以包含多个属性和方法,属性是对象的状态,方法是对象的行为。本文将总结Javascript中常见的对象属性和方法。 对象属性 对象属性描述对象的状态,包括数据属性和访问器属性两种。 数据属性 数据属性描述对象的简单值,包含以下属性: va…

    C 2023年5月22日
    00
  • C语言实现翻译功能

    C语言实现翻译功能的攻略包含以下步骤: 确定翻译API 在开始编写翻译功能之前,必须先确定使用哪个翻译API。常用的翻译API有百度翻译API、谷歌翻译API、有道翻译API等。需要注意的是,不同的翻译API具有不同的使用规则和参数设置,使用之前需要仔细阅读相应的开发文档。 在C语言中调用API 确定了翻译API后,需要在C语言中编写代码调用该API。一般情…

    C 2023年5月23日
    00
  • 在C++中如何阻止类被继承详解

    在C++中,如果想要阻止某个类被继承,可以使用以下两种方法。 使用final关键字 在C++11标准中,引入了final关键字,可以用于修饰类、函数和变量,表示它们是最终版本,不允许子类、派生函数和别名修改。如果将一个类声明为final,则它不可以被其他类继承。 示例代码: class Base final { // 将Base类声明为final,不可以被继…

    C 2023年5月23日
    00
  • C语言 循环详解及简单代码示例

    C语言循环详解 循环语句是程序中经常使用的一种结构,对于重复性工作的处理起到非常重要的作用。本篇文章将详细讲解C语言中循环语句的各种类型,以及在实际编程中的使用方法和注意事项。 执行顺序 在介绍C语言中的循环语句之前,需要了解一下程序的执行顺序,通常程序是按照从上到下的顺序依次执行的,而且一旦程序执行到某个循环语句会跳转到循环体执行完后再返回继续执行下一条语…

    C 2023年5月23日
    00
  • OPPO R1C手机怎么样?OPPO R1C全面评测

    OPPO R1C手机评测 硬件 外观设计 OPPO R1C外观采用玻璃和金属材质相结合的设计,相当抢眼,整体风格十分简洁大方。其中,反光玻璃面板非常亮丽,呈现出不同于其它手机的视觉冲击力。另外,机身尺寸合适,拿在手里使用非常舒适。 内部配置 OPPO R1C内部配备了骁龙615处理器+2GB内存+16GB机身存储,能够满足日常使用需求,运行流畅,游戏也可以较…

    C 2023年5月23日
    00
  • C#实现的ACCESS数据库操作类完整实例

    下面我将详细讲解“C#实现的ACCESS数据库操作类完整实例”的完整攻略。 1. 准备工作 在使用C#操作ACCESS数据库之前,需要做以下准备工作: 安装ACCESS数据库驱动程序 在C#项目中添加对ACCESS数据库的引用 在代码中引入对System.Data.OleDb命名空间的引用 2. 创建ACCESS数据库连接对象 在开始对ACCESS数据库进行…

    C 2023年5月22日
    00
  • C语言 数组指针详解及示例代码

    C语言 数组指针详解及示例代码 什么是指针 指针是一种变量,它存储了一个地址。本质上,指针就是一个整数,但是它的类型与所指向对象的类型相同。在C语言中,我们可以通过指针来访问内存中的数据,或者在函数间传递指针来避免在函数之间进行大量的数据复制。 什么是数组指针 数组指针是指向数组的指针。与数组名类似,数组指针也可以被认为是第一个元素的地址。因此,当我们对数组…

    C 2023年5月24日
    00
  • C#/.Net开发chatGPT、openAI的简单步骤

    C#/.Net开发chatGPT、openAI的简单步骤: 在介绍开发chatGPT、openAI之前,我们需要先了解什么是chatGPT、openAI。 chatGPT是一种语言模型,可以被用于生成自然语言文本。它的原理是基于神经网络技术,通过学习大量的语言文本,建立一个预测模型,用于生成和上下文相关的自然语言文本。openAI则是一种人工智能编程平台,该…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部