template <classT> classvector { public: // 构造函数 vector(int size = 10) : First(new T[size]) , Last(First) , End(First + size) { // 使用初始化列表方式 } // 拷贝构造函数 vector(const vector<T>& rhs) { // 获取容器长度 int size = rhs.End - rhs.First; // 创建新容器 First = new T[size]; // 获取数据长度 int len = rhs.Last - rhs.First; // 遍历赋值 int i = 0; for (i = 0; i < len; i++) { First[i] = rhs.First[i]; } // 重置 Last 和 End Last = First + len; End = First + size; } // 析构函数 ~vector() { delete[] First; First = End = Last = nullptr; } // 赋值重载 vector<T>& operator=(const vector<T>& rhs) { // 判断 if (this == &rhs) { return *this; }
// 清除 delete[] First;
// 重新计算并赋值 // 获取容器长度 int size = rhs.End - rhs.First; // 创建新容器 First = new T[size]; // 获取数据长度 int len = rhs.Last - rhs.First; // 遍历赋值 int i = 0; for (i = 0; i < len; i++) { First[i] = rhs.First[i]; } // 重置 Last 和 End Last = First + len; End = First + size;
return *this; }
// 共有方法 // push_back 方法:容器添加内容 voidpush_back(const T& val) { if (full()) { extend(); } // 先给之以后,下次 push 则会递增内存 *Last++ = val; } // pop_back 方法:容器删除内容 voidpop_back() { if (empty()) { return; } --Last; } // back 方法:输出删除内容 T back()const { return *(Last - 1); } // full 方法:容器是否已满 boolfull()const { return Last == End; } // empty 方法:容器是否为空 boolempty()const { return Last == First; } // size 方法:获取内容厂区 intsize()const { return Last - First; }
// 私有方法 private: // vector 容器扩容 voidextend() { int size = End - First; T* ptmp = new T[size * 2];
// 遍历并转移 int i = 0; for (i = 0; i < size; i++) { ptmp[i] = First[i]; } // 删除原先的 delete[] First;
// 重新覆盖 First = ptmp; Last = First + size; End = First + 2 * size; }
// 拷贝函数 vector(const vector<T>& rhs) { // 定义 大小 int size = rhs.End - rhs.First; // 空间适配器开辟空间 First = _allocator.allocate(size); // 获取长度 int len = rhs.Last - rhs.First;
// 拷贝数据 int i = 0; for (i = 0; i < len; i++) { // 空间适配器的构造方法赋值 _allocator.construct(First + i, rhs.First[i]); } // 重新配置 Last 和 End Last = First + len; End = First + size; } // 析构函数 ~vector() { cout << "~vector" << endl; // 析构容器有效的元素,然后释放 First 指针指向的堆内存 T* p = First; for (p = First; p != Last; p++) { // cout << "p =" << p << endl; // 把 First 指针指向的数组的有效元素进行析构操作 _allocator.destroy(p); } // 释放堆上的数组内存 _allocator.deallocate(First); // 重置 指针 First = Last = End = nullptr; }
// 赋值重载 vector<T>& operator=(const vector<T>& rhs) { // 1. 判断 if (this == &rhs) { return *this; } // 2. 清空 // 析构容器有效的元素,然后释放 First 指针指向的堆内存 T* p = First; for (p = First; p != End; p++) { // 把 First 指针指向的数组的有效元素进行析构操作 _allocator.destroy(p); } // 释放堆上的数组内存 _allocator.deallocate(First);
// 3. 重新计算 // 定义 大小 int size = rhs.End - rhs.First; // 空间适配器开辟空间 First = _allocator.allocate(size); // 获取长度 int len = rhs.Last - rhs.First;
// 拷贝数据 int i = 0; for (i = 0; i < len; i++) { // 空间适配器的构造方法赋值 _allocator.construct(First + i, rhs.First[i]); } // 重新配置 Last 和 End Last = First + len; End = First + size;
return *this; }
// 公共方法 // 1. push_back 方法 voidpush_back(const T& val) { // 判断 if (full()) { expand(); } // 通过适配器添加内容 _allocator.construct(Last, val); Last++; } // 2. pop_back 方法 voidpop_back() { if (empty()) { return; } // 不仅要把 Last 指针--,还需要析构删除的元素 --Last; _allocator.destroy(Last); } // 3. back 方法 T back()const { return *(Last - 1); } // 4. full 方法 boolfull()const{ return Last == End; } // 5. empty 方法 boolempty()const{ return First == Last; } // 6. size 方法 intsize()const{ return Last - First; }
// 拷贝函数 vector(const vector<T>& rhs) { // 定义 大小 int size = rhs.End - rhs.First; // 空间适配器开辟空间 First = _allocator.allocate(size); // 获取长度 int len = rhs.Last - rhs.First;
// 拷贝数据 int i = 0; for (i = 0; i < len; i++) { // 空间适配器的构造方法赋值 _allocator.construct(First + i, rhs.First[i]); } // 重新配置 Last 和 End Last = First + len; End = First + size; } // 析构函数 ~vector() { cout << "~vector" << endl; // 析构容器有效的元素,然后释放 First 指针指向的堆内存 T* p = First; for (p = First; p != Last; p++) { // cout << "p =" << p << endl; // 把 First 指针指向的数组的有效元素进行析构操作 _allocator.destroy(p); } // 释放堆上的数组内存 _allocator.deallocate(First); // 重置 指针 First = Last = End = nullptr; }
// 赋值重载 vector<T>& operator=(const vector<T>& rhs) { // 1. 判断 if (this == &rhs) { return *this; } // 2. 清空 // 析构容器有效的元素,然后释放 First 指针指向的堆内存 T* p = First; for (p = First; p != End; p++) { // 把 First 指针指向的数组的有效元素进行析构操作 _allocator.destroy(p); } // 释放堆上的数组内存 _allocator.deallocate(First);
// 3. 重新计算 // 定义 大小 int size = rhs.End - rhs.First; // 空间适配器开辟空间 First = _allocator.allocate(size); // 获取长度 int len = rhs.Last - rhs.First;
// 拷贝数据 int i = 0; for (i = 0; i < len; i++) { // 空间适配器的构造方法赋值 _allocator.construct(First + i, rhs.First[i]); } // 重新配置 Last 和 End Last = First + len; End = First + size;