c++ vector模拟实现代码

  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日

相关文章

  • C程序 插入排序

    下面是关于”C程序 插入排序”的完整使用攻略。 插入排序是什么? 插入排序是一种简单直观的、比较常用的排序算法。其基本思想是将待排序的数组分成两部分,已排序和未排序,然后将未排序的元素一个一个插入到已排序部分的正确位置上,直到整个数组都被排序。 插入排序的实现 下面是一份C程序的插入排序实现,以进行升序排序为例。 #include <stdio.h&g…

    C 2023年5月9日
    00
  • 基于C++泛型编程职工管理系统

    基于C++泛型编程的职工管理系统需要实现以下功能: 实现职工的基本信息,包括职工号、姓名、性别、部门等信息的录入、修改、删除和展示功能。 实现职工的信息的按职工号、姓名、性别、部门等关键字进行查询的功能。 实现职工信息的读取和保存功能,以便于程序下次运行时可以直接读取上次信息。 实现按职工号、姓名、性别、部门等关键字进行职工的自然排序的功能。 下面是对应的实…

    C 2023年5月23日
    00
  • PHP实现基于图的深度优先遍历输出1,2,3…n的全排列功能

    实现基于图的深度优先遍历并输出1,2,3…n的全排列功能可以分为以下几个步骤: 构建无向图 为了实现深度优先遍历,我们需要先构建一个无向图。对于1,2,3…n,我们可以将它们看成节点,而对于任意两个节点i和j,如果它们代表的数字的差的绝对值等于1,那么i和j之间就可以连一条边。这样,我们就可以得到一个无向图,方便后续的遍历操作。 实现深度优先遍历 深…

    C 2023年5月22日
    00
  • C语言实现打印星号图案

    关于C语言实现打印星号图案的攻略,我可以提供如下内容: 标题 C语言实现打印星号图案的完整攻略 代码块 #include <stdio.h> int main() { int i, j, n = 5; for(i = 1; i <= n; i++) { for(j = 1; j <= i; j++) { printf("* …

    C 2023年5月30日
    00
  • MySQL实例精讲单行函数以及字符数学日期流程控制

    MySQL实例精讲单行函数以及字符数学日期流程控制 MySQL提供了许多单行函数来处理数据,例如字符串处理、数学计算、日期时间处理等。同时,MySQL也提供了常见的流程控制功能,如if语句、case语句等。本文将详细讲解MySQL的单行函数以及流程控制功能。 单行函数 MySQL的单行函数包括了字符串函数、数值函数、日期函数等,下面将分别介绍。 字符串函数 …

    C 2023年5月22日
    00
  • C语言中如何进行线程和进程操作?

    C语言在操作系统中提供了一些库函数,可以方便地进行进程和线程的操作。 进程操作 创建新进程 使用 fork() 函数可以在当前进程中创建一个新进程。新进程继承了父进程的所有属性,但是父进程和子进程拥有独立的内存空间。下面是一个示例: #include <sys/types.h> #include <unistd.h> #include…

    C 2023年4月27日
    00
  • c++对象内存布局示例详解

    首先,让我们来了解一下C++对象的内存布局。在实际编程中,我们经常会涉及到创建对象,并根据对象来进行操作。因此,了解对象在内存中所占的布局情况,对于有效地管理内存使用以及提高代码执行效率都很有帮助。 C++对象内存布局包括以下三个部分: 对象的数据成员 对象的虚函数表指针 (vptr) 对象的填充字节 数据成员是对象实际存储数据的部分,虚函数表指针用于处理虚…

    C 2023年5月22日
    00
  • C程序 使用递归查找自然数之和

    C程序使用递归查找自然数之和 概述 递归是一种函数自我调用的方式,通过递归可以简洁地解决一些复杂的问题。在C语言中,可以使用递归实现查找自然数之和的功能,本文将详细介绍该功能的实现方法及使用攻略。 实现方法 使用递归计算自然数之和,需要使用到如下几个步骤: 判断递归终止的条件,通常是n变为0或1时返回相应的值。 使用函数自身进行递归调用,将n-1作为参数传入…

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