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

更新时间:2023-06-22 01:13:26 阅读: 评论:0

C++⼿动实现vector及代码细节详解
⽂章⽬录
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 inrt(iterator it,value_type val)向vector实例化对象的it位置插⼊⼀个元素
void era(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参数。若没有该参数,每增添⼀个新的元素,就需要重新申请空间存放新的元素,这会消耗较多时间,效率不⾼。故⽽在实现的时候我们采⽤倍增的⽅式提前申请较⼤空间,倍增的意思就是当元素个数⼤于空间⼤⼩时,申请的空间将会是原空间的⼆倍,元素个数和所申请的空间的⼤⼩对⽐如下:
元素个数空间⼤⼩
11
22
34
44
58
使⽤这种⽅式申请空间,当元素个数越来越多,所需申请的次数相对之前的申请⽅式会越来越⼩。
构造函数
构造函数主要⽤创建对象时对成员变量进⾏初始化
在该部分的实现涉及了初始化列表的相关知识。具体格式为在构造函数名后⾯使⽤:变量名(初始化值), ...,需要特别注意的是,初始化列表的初始化顺序并不是由构造函数后的变量顺序决定的,⽽是由类中成员变量的定义顺序决定的。
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;
return*this;
}
[]运算符重载函数
针对vector⽽⾔,[]运算符重载函数具体实现的是vec[0];,按函数调⽤来理解就是vec.operator[](0)。
具体代码如下:
value_type&operator[](size_t index){
return _data[index];
}
==运算符重载函数
针对vector⽽⾔,[]运算符重载函数具体实现的是vec1 == vec2;,该判断成⽴成返回true,不成⽴返回fal。按函数调⽤来理解就
是vec1.operator==(vec2)。
具体代码如下:
bool operator==(const vector& vec)const{
if(_size!=vec._size)return fal;
for(int i=0; i<_size;++i){
if(_data[i]!=vec._data[i])
return fal;
}
return true;
}
增添元素
该部分分为两种。⼀种是默认位置增添,也就是在_data的末尾增添元素,对应实现的函数名为push_back;另⼀种是指定位置增添,也就是说在_data的it位置插⼊⼀个元素对应实现的函数名为inrt。
早上好图这两个函数的总体思路都是向⼀个连续空间中增添元素,我们需要将插⼊的位置⾄最后⼀个元素统⼀向后移动⼀个位置,从⽽空出⼀个位置⽤于存放新元素。在此我们也会实现倍增的⽅式申请空间,即_capacity *=2;,这⾥需要特别处理的是当原本的vec是空的时候,我们⽆法使⽤该代码来统⼀处理。具体如下:
push_back
相关代码如下:
void push_back(value_type val){
if(0==_capacity){
_capacity =1;
_data =new value_type[1];
}el if(_size+1> _capacity){
_capacity *=2;
value_type* temp =new value_type[_capacity];
for(int i=0; i<_size;++i){
temp[i]= _data[i];
}
delete[] _data;
_data = temp;
炸羊排}
回味无穷什么意思
_data[_size]= val;
++_size;
}
inrt
相关代码如下:
void inrt(iterator it, value_type val){
int index=it-_data;
if(0==_capacity){
_capacity =1;
_data =new value_type[1];
_data[0]= val;
}el if(_size+1> _capacity){
_capacity *=2;
value_type* temp =new value_type[_capacity];
for(int i=0; i<index;++i){
temp[i]= _data[i];
}
temp[index]= val;
for(int i=index; i<_size; i++){
temp[i+1]= _data[i];
}
delete[] _data;
_data = temp;
}el{
for(int i=_size-1; i>=index;--i){
_data[i+1]= _data[i];
}
_data[index]= val;
}
++_size;
}
读书摘要
删除元素
删除元素分为两种⽅式。⼀种为删除末尾元素,所实现的函数名为pop_back,另⼀种是指定位置删除元素,所实现的函数名为era。pop_back
void pop_back(){
--_size;
}
ear
void era(iterator it){
size_t index=it-_data;
for(int i=index; i<_size-1;++i){
_data[i]= _data[i+1];
}
--_size;
}
其他函数
其他函数功能⾮常简单,就不多加解释了
枇杷花茶
value_type front()const
返回vector中的第⼀个元素
value_type front()const{
return _data[0];
}
value_type back()const

本文发布于:2023-06-22 01:13:26,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1049100.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:对象   函数   元素   空间
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图