C++手动实现vector及代码细节详解

本文详细介绍了C++中一个自定义的miniSTL向量容器的实现,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、元素访问、增添和删除元素等核心成员函数。此外,还解析了成员变量如_data、_size和_capacity的作用,以及如何通过模板化实现对任意类型数据的支持。文章以代码示例和详细注释的形式展示了每个函数的功能和实现逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


vector中的成员函数总结

函数名 功能
vector() 构造函数
~vector() 析构函数
vector(const vector& vec) 拷贝构造函数
vector& operator=(const vector& vec) 赋值运算符重载函数
value_type& operator[](size_t index) []运算符重载函数(用于取出vector实例化对象的第index个元素)
bool operator==(const vector& vec)const ==运算符重载函数(用于判断两个vector对象是否相等)
void push_back(value_type val) 向vector示例化对象增添元素
void pop_back() 删除vector实例化对象最后一个元素
void insert(iterator it,value_type val) 向vector实例化对象的it位置插入一个元素
void erase(iterator it) 删除vector实例化对象it位置的元素
value_type front()const 取出vector对象中的第一个元素
value_type back()const 取出vector对象中的最后一个元素
iterator begin() 获取vector实例化对象的元素首地址
iterator end() 获取vector实例化对象的最后一个元素的下一个地址
size_t size()const 获取vector实例化对象的元素个数
size_t capacity()const 获取vector实例化对象所占空间大小
bool empty() 判断vector实例化对象是否为空

vector中的成员变量

首先为了实现vector可以实例化任意数据类型的对象,我们需要对它进行模板化,在类的定义之前增加如下语句:

template<typename T>

如我们想要实例化一个int型vector的时候,使用vector<int> vec,此时模板中的T就是指int型数据类型,那么T*就是指int*数据类型。

以下就是我们实现vector所用到的成员变量:

  • _data : 用于申请一段连续空间的指针
  • _size : 用于存放该vector对象中存放元素的个数
  • _capacity : 用于存放vector对象所申请的空间大小

该部分相关代码如下:

public:
    typedef T value_type;  // 这个并不是成员变量,主要时为了增强可读性
    typedef T* iterator;   // 其时就是重新起别名
private:
    value_type* _data;
    size_t _size;
    size_t _capacity;

我们来解释一下_capacity参数。若没有该参数,每增添一个新的元素,就需要重新申请空间存放新的元素,这会消耗较多时间,效率不高。故而在实现的时候我们采用倍增的方式提前申请较大空间,倍增的意思就是当元素个数大于空间大小时,申请的空间将会是原空间的二倍,元素个数和所申请的空间的大小对比如下:

元素个数       空间大小
   1            1
   2            2
   3            4
   4            4
   5            8

使用这种方式申请空间,当元素个数越来越多,所需申请的次数相对之前的申请方式会越来越小。

构造函数

构造函数主要用创建对象时对成员变量进行初始化

在该部分的实现涉及了初始化列表的相关知识。具体格式为在构造函数名后面使用:变量名(初始化值), ...,需要特别注意的是,初始化列表的初始化顺序并不是由构造函数后的变量顺序决定的,而是由类中成员变量的定义顺序决定的。

 vector():_data(NULL),_size(0),_capacity(0){
   }

析构函数

析构函数主要用于释放为实例化对象所分配的空间,当某个对象离开自己的作用域时就会自动调用析构函数,释放空间。

这里涉及一个一个知识点为,如何使用delete释放数组所占空间,必须使用delete [] 数组名来释放数组空间,单独delete 数组名只会释放数组中的第一个元素的空间。

相关代码如下:

    ~vector(){
   
        delete [] _data;
        _data = NULL;
        _size = 0;
        _capacity = 0;
    }

拷贝构造函数

拷贝构造函数主要功能为:用于实现vector<int> vec1 = vec2该代码功能,即实例化一个对象的时,使用另外一个对象的成员变量初始化该对象。

相关代码如下:

    vector(const vector& vec){
   
        _size = vec._size;
        _capacity = vec._capacity;
        _data = new value_type[_capacity];
        for(int i=0;i<_size;++i){
   
            _data[i] = vec._data[i];
        }
    }

如果要细究,这里其实涉及引用,const等相关知识。如果对此有疑惑,建议可以查阅相关资料。

运算符重载函数

该部分重载的运算符有:=, [] , ==。运算符重载函数的函数名格式为返回值 operator运算符(传入的参数)

我们以==运算符重载为例子,该运算符功能为判断两个对象是否相等,所以返回值为bool型,传入参数为进行比较的另外一个对象,故而函数名为bool operator==(const vector& vec)const。其中的const指的是所传入的参数是不可修改的。

赋值运算符重载函数

赋值运算符重载函数时将传入参数的所有信息拷贝一份。
针对vector而言,赋值运算符重载函数具体实现的是vec1 = ve2;,按函数调用来理解就是vec1.operator=(vec2)

具体代码如下:

    vector& operator=(const vector& vec){
   
        if(this == &vec) return *this;
        value_type* temp = new value_type[vec._capacity];
        for(int i=0;i<vec._size;++i){
   
            temp[i] = vec._data[i];
        }
        delete [] _data;
        _data = temp;
        _size = vec._size;
        _capacity = vec._capacity;
       
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值