当前位置: 代码迷 >> 综合 >> 手写vector实现
  详细解决方案

手写vector实现

热度:57   发布时间:2024-02-22 20:29:32.0
//vector类的简单实现
#include<algorithm>
#include<iostream>
#include<assert.h>
using namespace std;
template<class T>
class myVector{private://每次扩展的长度#define WALK_LENGTH 64;public://默认构造函数myVector():array(0), theSize(0), theCapacity(0){}myVector(const T& t, unsigned int n):array(0), theSize(0), theCapacity(0){while(n--){push_back(t);}}//拷贝构造函数myVector(const myVector<T>& other): array(0), theSize(0), theCapacity(0){*this = other;}//重载=myVector<T>& operator = (myVector<T>& other){if(this == &other){return * this;}clear();theSize = other.size();theCapacity = other.capacity();array = new T[theCapacity];for(unsigned int i = 0;i < theSize; ++i){array[i] = other[i];}return *this;}~myVector(){clear();}void clear(){deallocator(array);array = 0;theSize = 0;theCapacity = 0;}T& operator[](unsigned int pos){assert(pos<theSize);return array[pos];}unsigned int size(){return theSize;}unsigned int capacity(){return theCapacity;}bool empty(){return theSize == 0;}void push_back(const T& t){insert_after(theSize - 1, t);}void push_front(const T& t){insert_before(0, t);}void insert_after(int pos, const T& t){insert_before(pos+1, t);}void insert_before(int pos, const T& t){if(theSize == theCapacity){T* oldArray = array;theCapacity += WALK_LENGTH;array = allocator(theCapacity);//memcpy(array, oldArray, theSize * sizeof(T));for(unsigned int i = 0;i < theSize; ++i){array[i] = oldArray[i];}deallocator(oldArray);}for(int i = (int)theSize++; i > pos; --i){array[i] = array[i - 1];}array[pos] = t;}void erase(unsigned int pos){if(pos< theSize){--theSize;for(unsigned int i = pos; i < theSize; ++i){array[i] = array[i + 1];}}}private:T* allocator(unsigned int size){return new T[size];}void deallocator(T* arr){if(arr){delete[] arr;}}private:T* array;unsigned int theSize;unsigned int theCapacity;
};void print(myVector<int>& vector1){for(unsigned int i = 0;i < vector1.size(); ++i){cout<<vector1[i]<<",";}cout<<"alloc size = "<<vector1.capacity() <<", size = "<<vector1.size() <<endl;
}
int main(){myVector<int> myVector1;myVector<int> myVector2(0, 10);myVector2.push_front(1);myVector2.erase(11);print(myVector2);myVector1.push_back(2);myVector1.push_back(1);print(myVector1);myVector1.insert_after(1, 3);print(myVector1);myVector2 = myVector1;myVector2.insert_before(0, 0);myVector2.insert_before(1, -1);print(myVector2);return 0;
}

输出

1,0,0,0,0,0,0,0,0,0,0,alloc size = 64, size = 11
2,1,alloc size = 64, size = 2
2,1,3,alloc size = 64, size = 3
0,-1,2,1,3,alloc size = 64, size = 5

由此可见vector的特点是:

1.随即访问元素效率很高;

2.push_back的效率很高;

3.push_front的效率很低,不建议使用;

4.insert需要把插入位置以后的元素全部后移,效率较低,不建议使用;

5.erase需要把删除位置后面的元素全部前移,效率较低,不建议使用;

6.当内存不够时,需要重新申请内存,再把以前的元素复制过来,效率比较低。