meVector
28 Jun 2020
3 min read
myVector
设计思想
vector其实是更高级的数组,可以自由的进行赋值、存储数据、使用类似迭代器的方式读取数据等。由于本实例中myVector为int类,所以迭代器为int *型即可。
myVector类中
私有变量
选取了
private:
int *array;
int capacity;
int size
三个,其中array是通过指针指向堆内存的方式存储数据,类似于安全数组。capacity用于存储当前数组的总容量,size为当前已经存储的数据的下一个存储位置的下标。通过size与capacity的比较,可以较为容易的检验当前数组是否有剩余容量来存储下一个push_back的数据的空间。
类的构造函数
myVector()
{
size = 0;
capacity = 3;
array = new int[capacity];
}
myVector(int number, int value = 0)
{
size = capacity = number;
array = new int[capacity];
for (int i = 0; i < number; ++i)
{
array[i] = value;
}
}
myVector(const myVector& parent)
{
size = parent.size;
capacity = parent.capacity;
array = new int[capacity];
for (int i = 0; i < size; ++i)
{
array[i] = parent.array[i];
}
}
有三种,分别为:
- 无参数构造:默认开辟3个整形大小的空间,myVector中不存储数据
- 参数构造:main中传递myVector的大小 (number个int) 和 (value,默认为0)
- 拷贝构造:与parent对象存储相同的数据
析构函数
~myVector()
{
if (array)
{
delete[] array;
array = nullptr;
size = capacity = NULL;
}
}
析构函数中先判断array是否为nullptr,然后进行堆内存的析构和变量归零
功能函数
void push_back(const int& data)
{
if (size >= capacity)
{
int *tempArray = array;
array = new int[capacity * 2];
for (int i = 0; i < size; ++i)
{
array[i] = tempArray[i];
}
}
array[size++] = data;
}
int *begin()
{
return array;
}
int *end()
{
return array + size;
}
- push_back先判断是否有剩余空间留给新数据。若无剩余空间则开辟capacity两倍内存的新数组并进行数据迁移。最后将数据放入myVector中
- begin返回首地址,end返回当前已经存储的数据的结尾地址
代码
#include <iostream>
using namespace std;
class myVector {
private:
int *array;
int capacity;
int size;
public:
myVector()
{
size = 0;
capacity = 3;
array = new int[capacity];
}
myVector(int number, int value = 0)
{
size = capacity = number;
array = new int[capacity];
for (int i = 0; i < number; ++i)
{
array[i] = value;
}
}
myVector(const myVector& parent)
{
size = parent.size;
capacity = parent.capacity;
array = new int[capacity];
for (int i = 0; i < size; ++i)
{
array[i] = parent.array[i];
}
}
myVector& operator=(const myVector& v)
{
if (this != &v)
{
size = v.size;
capacity = v.capacity;
array = new int[capacity];
for (int i = 0; i < size; ++i)
{
array[i] = v.array[i];
}
}
}
~myVector()
{
if (array)
{
delete[] array;
array = nullptr;
size = capacity = NULL;
}
}
int& operator[](int index)
{
if (index < size)
return array[index];
/* else */
/* { */
/* cout << "Index Error: return NULL" << endl; */
/* return NULL; */
/* } */
}
void push_back(const int& data)
{
if (size >= capacity)
{
int *tempArray = array;
array = new int[capacity * 2];
for (int i = 0; i < size; ++i)
{
array[i] = tempArray[i];
}
}
array[size++] = data;
}
int *begin()
{
return array;
}
int *end()
{
return array + size;
}
};
int main()
{
myVector v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
/* myVector::iterator itra; */
int *itra;
itra=v.begin();
while(itra!=v.end())
{
cout << * itra << endl;
itra++;
}
return 0;
}