面试的时候被打击到了,实现异构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
|
#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; }
|