c++实现一个自己的vector。我们用到c++的类、重载、模板类。
#pragma once #include#include #include template class MyVector { public: MyVector(int size = 10); ~MyVector(); //访问 T& at(int index) const; T& front() const; T& back() const; T& operator[](int index); //容量 bool empty() const; int size() const; int capacity() const; //修改 void clear(); void insert(int index, const T& d); void remove(int index); void push_back(const T& d); void pop_back(); private: T* data; int length; int current_pos; }; template MyVector ::MyVector(int size) :length(size), current_pos(0) { if (data != nullptr) { delete[] data; data = nullptr; } data = new T[length]; memset(data, 0, length * sizeof(T)); } template MyVector ::~MyVector() { if (data != nullptr) { delete[] data; data = nullptr; } } template T& MyVector ::at(int index) const { assert(index > 0 || index < current_pos); return data[index]; } template T& MyVector ::front() const { assert(current_pos > 0); return data[0]; } template T& MyVector ::back() const { assert(current_pos > 0); return data[current_pos - 1]; } template T& MyVector ::operator[](int index) { assert(index > 0 || index < current_pos); return data[index]; } template bool MyVector ::empty() const { return current_pos == 0 ? true : false; } template int MyVector ::size() const { return current_pos; } template int MyVector ::capacity() const { return length; } template void MyVector ::clear() { current_pos = 0; } template void MyVector ::insert(int index, const T& d) { assert(index > 0 || index < current_pos); if (current_pos == length) { T* temp = new T[length + 10]; memset(temp, 0, (length + 10) * sizeof(T)); memcpy(temp, data, length * sizeof(T)); length += 10; delete[]data; data = nullptr; data = temp; } memcpy(data + index + 1, data + index, (length - index) * sizeof(T)); data[index] = d; // 当前数组指针 +1 current_pos++; } template void MyVector ::remove(int index) { assert(index > 0 || index < current_pos); memcpy(data + index, data + index + 1, (current_pos - index) * sizeof(T)); current_pos--; } template void MyVector ::push_back(const T& d) { // 检查当前数组大小是否可用 if (current_pos == length) { // 扩容,每次扩容 10 个数据大小的空间 T* temp = new T[length + 10]; memset(temp, 0, (length + 10) * sizeof(T)); memcpy(temp, data, length * sizeof(T)); length += 10; delete[] data; data = nullptr; data = temp; } // 插入数据 data[current_pos] = d; // 当前数组指针 +1 current_pos++; } template void MyVector ::pop_back() { assert(current_pos > 0); current_pos--; }
main,cpp
#include#include "MyVector.h" using namespace std; int main() { MyVector vec; for (int i = 0; i < vec.capacity(); i++) vec.push_back(i); vec.push_back(10); cout << "capacity: " << vec.capacity() << endl; for (int i = 0; i < vec.size(); i++) cout << vec.at(i) << ", "; cout << endl; vec.insert(0, 5); vec.insert(1, 15); for (int i = 0; i < vec.size(); i++) cout << vec[i] << ", "; cout << endl; vec.remove(1); vec.pop_back(); for (int i = 0; i < vec.size(); i++) cout << vec[i] << ", "; cout << endl; cout << "front: " << vec.front() << ", back: " << vec.back() << endl; return 0; }



