myVector
设计思想
vector其实是更高级的数组,可以自由的进行赋值、存储数据、使用类似迭代器的方式读取数据等。由于本实例中myVector为int
类,所以迭代器为int *
型即可。
myVector类中
私有变量
选取了
1 2 3 4
| private: int *array; int capacity; int size
|
三个,其中array是通过指针指向堆内存的方式存储数据,类似于安全数组。capacity用于存储当前数组的总容量,size为当前已经存储的数据的下一个存储位置的下标。通过size与capacity的比较,可以较为容易的检验当前数组是否有剩余容量来存储下一个push_back的数据的空间。
类的构造函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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对象存储相同的数据
析构函数
1 2 3 4 5 6 7 8 9 10
| ~myVector() { if (array) { delete[] array; array = nullptr; size = capacity = NULL; } }
|
析构函数中先判断array是否为nullptr,然后进行堆内存的析构和变量归零
功能函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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返回当前已经存储的数据的结尾地址
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| #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]; } 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); int *itra; itra=v.begin();
while(itra!=v.end()) { cout << * itra << endl; itra++; }
return 0; }
|