CC

自然万物都趋向从有序变得无序

0%

c++实现vector

面试的时候被打击到了,实现异构vector居然没有实现出来,忘记了能不能给内置数据类型使用new申请空间了。

主要实现了构造函数,push_back函数,以及[]操作。

通过new申请空间会使用其在堆上存在,不会因为函数结束而被释放掉。

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
/*
*@File Name :my_vector.cc
*@Author :cc
*@Version :1.0.0
*@Date :2022/4/23 9:23
*@Description :
*@Function List :
*@History :
*/
#include "iostream"
#include "algorithm"

using namespace std;

template<typename T>
class MyVector {
private:
T *nums;
const int MIN_CAP = 16;
const double INCREASE = 1.5;
int cap;
int size;
public:
MyVector(int new_cap = 0) {
nums = new T[MIN_CAP + new_cap];
cap = MIN_CAP + new_cap;
size = 0;
}

MyVector(int newCap, T *data) {
cap = newCap + MIN_CAP;
nums = new T[cap];
size = newCap;
for (int i = 0; i < size; i++) {
nums[i] = data[i];
}
}

MyVector(const MyVector &vec) {
delete[] nums;
cap = vec.cap;
size = vec.size;
nums = new T[cap];
for (int i = 0; i < size; i++)
nums[i] = vec.nums[i];
}

~MyVector() {
delete[] nums;
}

void push_back(T val) {
if (size == cap) {
T *tmp = nums;
nums = new T[int(cap * INCREASE)];
for (int i = 0; i < cap; i++) {
nums[i] = tmp[i];
}
cap = int(cap * INCREASE);
delete[]tmp;
}
nums[size++] = val;
}

T &operator[](const int &idx) {
if(idx >= size){
try {
throw "error";
}
catch (const char *c) {
cout<<c<<endl;
}
}
return nums[idx];
}
};

int main() {
MyVector<int> vec(5);
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec[3] = 4;
for (int i = 0; i < 4; i++)
cout << vec[i] << endl;
return 0;
}