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

下面我将给您详细讲解“C++模拟实现vector示例代码”的完整攻略。

1. 什么是Vector

Vector(又称为动态数组)是C++ STL中的一种容器,它可以在运行的过程中自动调整自己的大小,且支持随机访问,其底层是基于数组实现的。

2. 实现Vector的需求

C++中的vector容器具有以下功能:

  1. 动态扩容/缩容
  2. 随机访问
  3. 插入/删除指定位置元素
  4. 计算元素数量
  5. 支持迭代器等功能

基于以上几点,我们可以初步设想出需要实现以下几个函数:

class Vector{
    public:
        Vector();         // 默认构造函数
        Vector(int size);  // 构造给定大小的vector
        Vector(const Vector& v); // 拷贝构造函数
        Vector& operator=(const Vector& other);  //赋值运算符重载
        ~Vector();   //析构函数
        T& at(int index);  //返回index位置的元素,越界则报错
        void push_back(const T& x); //在数组尾部插入x
        void pop_back();  // 删除末尾元素
        void clear();  // 清空容器
        int size() const; //返回vector的元素数量
        bool empty() const; //判断vector是否为空
};

其中,T是我们定义的模板类,表示vector中存储的数据类型。

3. Vector的实现

构造与析构函数的实现

首先,我们需要为vector定义默认构造函数和析构函数,代码如下:

template<class T>
Vector<T>::Vector(){
    size_ = 0;
    capacity_ = 0;
    data_ = nullptr;
}

template<class T>
Vector<T>::~Vector(){
    clear();
}

其中,size_表示当前vector的元素数量,capacity_表示当前vector的容量,data_表示指向动态数组的指针,而对clear()的调用是确保释放动态数组的内存空间。

其次,我们还需要实现拷贝构造函数和赋值运算符重载:

template<class T>
Vector<T>::Vector(const Vector<T>& v){
    size_ = v.size_;
    capacity_ = v.capacity_;
    data_ = new T[capacity_];
    for(int i = 0; i < size_; i++){
        data_[i] = v.data_[i];
    }
}

template<class T>
Vector<T>& Vector<T>::operator=(const Vector<T>& other){
    if(&other == this){
        return *this;
    }
    clear();
    size_ = other.size_;
    capacity_ = other.capacity_;
    data_ = new T[capacity_];
    for(int i = 0; i < size_; i++){
        data_[i] = other.data_[i];
    }
    return *this;
}

插入/删除指定位置的元素

这个需求比较简单,只需定义如下几个函数:

template<class T>
void Vector<T>::push_back(const T& x){
    if(size_ == capacity_){
        int new_capacity = capacity_ == 0 ? 1 : 2 * 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;
    }
    data_[size_++] = x;
}

template<class T>
void Vector<T>::pop_back(){
    if(size_ == 0){
        return;
    }
    size_--;
}

template<class T>
T& Vector<T>::at(int index){
    if(index < 0 || index > size_ - 1){
        throw std::out_of_range("index out of range");
    }
    return data_[index];
}

在实现push_back()时,需要先判断是否已经达到了初始容量,如果是的话就需要重新开辟一段新空间。

而在实现at()时,需要先进行越界判断,如果下标越界,则会抛出std::out_of_range异常。

计算元素数量

此需求已经在上面的代码中实现,可以直接调用size()函数。

随机访问

这个需求也比较简单,直接定义一个operator[]重载即可:

template<class T>
T& Vector<T>::operator[](int index){
    return at(index);
}

清空容器

这个需求也比较简单,只需定义如下函数:

template<class T>
void Vector<T>::clear(){
    delete[] data_;
    data_ = nullptr;
    size_ = 0;
    capacity_ = 0;
}

示例说明

接下来,我们分别演示一个int类型和一个string类型的vector:

#include<iostream>
#include<string>
#include "vector.h"
using namespace std;

void print_vector(const Vector<int>& v){
    cout << "[";
    for(int i = 0; i < v.size(); i++){
        cout << v[i];
        if(i != v.size() - 1){
            cout << ",";
        }
    }
    cout << "]" << endl;
}

void print_vector(const Vector<string>& v){
    cout << "[";
    for(int i = 0; i < v.size(); i++){
        cout << "\"" << v[i] << "\"";
        if(i != v.size() - 1){
            cout << ",";
        }
    }
    cout << "]" << endl;
}

int main(){
    Vector<int> v1;
    for(int i = 0; i < 10; i++){
        v1.push_back(i + 1);
    }
    print_vector(v1);
    cout << "vector size=" << v1.size() << endl;
    v1.pop_back();
    print_vector(v1);
    cout << "vector size=" << v1.size() << endl;

    Vector<string> v2;
    v2.push_back("hello");
    v2.push_back("world");
    v2.push_back("from");
    v2.push_back("vector");
    print_vector(v2);
    cout << "vector size=" << v2.size() << endl;
}

运行该程序,输出结果如下:

[1,2,3,4,5,6,7,8,9,10]
vector size=10
[1,2,3,4,5,6,7,8,9]
vector size=9
["hello","world","from","vector"]
vector size=4

可见,我们成功地实现了int和string类型的vector,它们拥有动态扩容、随机访问、插入/删除元素、计算元素数量、清空容器等多种功能。

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

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

相关文章

  • C C++ 题解LeetCode2360图中的最长环示例

    让我们详细讲解一下“C C++ 题解LeetCode2360图中的最长环示例”的完整攻略。 题目描述 题目传送门:LeetCode2360图中的最长环 题目描述: 给你一棵有n个节点的有根树,节点从0~n-1编号,树的根节点为0. 叶节点是指没有直接连接任何下一级节点的节点。本题中,树的节点从1到n编号, 而非从0到n-1编号. 节点 i 的父亲是 fath…

    C 2023年5月22日
    00
  • 用C语言实现井字棋游戏代码

    用C语言实现井字棋游戏代码 1. 程序框架 首先,我们需要理解井字棋游戏的规则,然后设计程序框架。井字棋通常是由两个玩家交替下棋,棋盘为 3×3 的矩阵,玩家通过落子来使自己的棋子连成一条直线。因此,我们需要至少维护以下信息: 棋盘状态,即每个位置的落子情况; 游戏进程状态,即当前轮到哪个玩家下棋,或者游戏是否结束。 接下来,我们可以设计井字棋程序的结构体,…

    C 2023年5月24日
    00
  • C语言中system()执行cmd命令打开关闭程序的方法

    下面是详细讲解“C语言中system()执行cmd命令打开关闭程序的方法”的完整攻略: 1. system()函数简介 在C语言中,system()函数是一个非常强大的函数,它可以让我们执行许多操作系统命令,包括打开和关闭程序。下面是system()函数的定义: #include <stdlib.h> int system(const char …

    C 2023年5月23日
    00
  • Android 中StringBuffer 和StringBuilder常用方法

    Android中StringBuffer和StringBuilder常用方法 引言 StringBuffer和StringBuilder类在Android开发中非常常用,这两个类都可以实现对字符串的添加、删除、修改等操作。由于使用方式相似且重新复制的开销相对较小,所以StringBuilder是在Java 5中引入的,而StringBuffer则是在早期版本…

    C 2023年5月22日
    00
  • C++简单又轻松的讲解类和对象中友元函数

    C++中类和对象中的友元函数是一个非常重要的概念,下面我将为大家详细讲解,包括什么是友元函数、如何使用友元函数以及友元函数的作用。 什么是友元函数? 友元函数是在类的外部定义的,但是它能够访问类的私有数据成员。例如,一个类中的成员函数可以访问该类的私有数据成员,而友元函数也可以访问该类的私有数据成员,因此它就被称为友元函数。 在C++中,友元函数有两种类型:…

    C 2023年5月23日
    00
  • VScode配置C语言环境完整版(亲测可用)

    以下是“VScode配置C语言环境完整版(亲测可用)”的完整攻略: 步骤一:安装MinGW编译器 访问MinGW官网(https://sourceforge.net/projects/mingw-w64/),下载适合自己操作系统版本的MinGW编译器安装程序,并进行安装。 打开安装目录下的bin文件夹,并将其中的mingw32-make.exe、gcc.ex…

    C 2023年5月23日
    00
  • Qt如何设置窗口屏幕居中显示以及设置大小

    关于Qt如何设置窗口屏幕居中显示以及设置大小,以下是一份完整攻略: 设置窗口居中 如果我们想让Qt应用程序中的窗口在启动时居中显示,可以按照以下步骤操作: 获取屏幕的Geometry:cpp QDesktopWidget* desktop = QApplication::desktop(); QRect screen = desktop->screen…

    C 2023年5月23日
    00
  • SQLite教程(十四):C语言编程实例代码(2)

    下面我将为你详细讲解“SQLite教程(十四):C语言编程实例代码(2)”的完整攻略。 SQLite教程(十四):C语言编程实例代码(2) 在这个教程中,我们将继续介绍SQLite在C语言中的应用。本文将分享两个C语言编程实例代码,分别是插入数据和查询数据。 插入数据 首先,我们需要通过C语言的sqlite3 API打开数据库: sqlite3 *db; i…

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