c++模拟实现vector

来源:互联网 发布:阿里云学生服务器饥荒 编辑:程序博客网 时间:2024/06/11 07:47

上一篇说到了list,这一篇我们来讨论讨论vector

vector和list都是STL中的常见容器。

它是一种顺序容器,支持随机访问。

和数极为相似,都是一块连续的内存空间。数组有的功能,它基本都能实现。

和数组不同的地方在于:数组分配到的空间是死的,不可变的;而vector却可以随着元素的不断插入,它自己会进行增容。当程序员无法知道到底需要多大的空间的时候,这无疑是最好的方法,并且可以最大程度上的节约空间。

下面直接上代码。

注释很清晰,希望对读者有帮助。

#include<iostream>#include<assert.h>#include<windows.h>using namespace std;typedef int DataType;class Vector{public:Vector(size_t capacity = 3):_data(new DataType[capacity])  //开辟空间, _size(0), _capacity(capacity){}//有n个值为data的元素Vector(const DataType& data, size_t n){}//拷贝构造函数Vector(const Vector& v)//:_capacity(v._capacity)//_size(v._size){_data = new DataType(_capacity);//比较1和2的优缺点//1.//memcpy(_data, v._data, sizeof(DataType)* _size);//2.for (size_t i = 0; i < _size; i++)_data[i] = v._data[i];}//复制运算符重载Vector& operator=(const Vector& v){if (this != &v){DataType* temp = new DataType[v._capacity];for (size_t i = 0; i < v._size; i++){temp[i] = v._data[i];}delete _data;_data = temp;_capacity = v._capacity;_size = v._size;}return *this;}//析构函数~Vector(){if (_data != NULL){delete _data;_data = NULL;_size = 0;_capacity = 0;}}void PrintVector();void PushBack(const DataType& data);void PopBack();void Insert(size_t pos, const DataType& data);void Erase(size_t pos);void Find(const DataType& data);void Clear();size_t Size();size_t Capacity();void ReSize(size_t size, const DataType& data);bool Empty();void Front();void Back();DataType& operator[](size_t index);DataType& At(size_t n);private://检查容量是否已满void CheckCapacity(){//实际大小>容量,扩容if (_size >= _capacity){DataType* temp = new DataType[_capacity * 2 + 3];for (int i = 0; i < _size; i++){temp[i] = _data[i];}delete _data;_data = temp;//_capacity *= 2;}}DataType* _data;size_t _size;size_t _capacity;};

下面是函数实现部分

#include"Vector.h" void Vector::PrintVector(){for (size_t i = 0; i < _size; i++)cout << _data[i];cout << endl;}void Vector::PushBack(const DataType& data){CheckCapacity();_data[_size++] = data;}bool Vector::Empty(){return _size == 0;}void Vector::PopBack(){if (!Empty())--_size;}//任意位置的插入void Vector::Insert(size_t pos, const DataType& data){//检查pos是否合法assert(pos);//检查容量CheckCapacity();for (int i = pos; i < _size; i++){//将前一个赋值给后一个_data[i] = _data[i-1];}_data[pos - 1] = data; //将data赋值给第pos个元素_size++;}//任意位置的删除void Vector::Erase(size_t pos){assert(pos);if (!Empty()){//pos前的元素不需要变动,只需要将其后的元素集体往前挪一个,最后给size++for (int i = pos; i < _size; i++){_data[i - 1] = _data[i];}_size--;}}void Vector::Find(const DataType& data){for (int i = 0; i < _size; i++){if (_data[i] == data)cout << "找到了" << endl;}}//清空元素void Vector::Clear(){if (_data != NULL){delete _data;_data = NULL;_capacity = 0;_size = 0;}}size_t Vector::Size(){return _size;}size_t Vector::Capacity(){return _capacity;}//改变Vector中_size的大小void Vector::ReSize(size_t size, const DataType& data){//size<_sizeif (size < _size)_size = size;// size > _sizeelse if (size>_size){int _oldsize = _size;_size = size;while (1){//_size < size < _capacityif (size < _capacity)break;elseCheckCapacity();}//size > _capacityfor (int i = _oldsize; i < _size; i++){_data[i] = data;}}}void Vector::Front(){ cout<<"the first is:"<< _data[0]<<endl;}void Vector::Back(){cout << "the last is:" << _data[_size-1] << endl;}//DataType& operator[](size_t index)DataType& Vector::At(size_t n){assert(n > 0 && n <= _size);return _data[n - 1];}void FunTest(){Vector v;v.PushBack(1);v.PushBack(2);v.PushBack(3);v.PushBack(4);v.PushBack(5);v.PushBack(6);v.PrintVector();v.PopBack();v.PrintVector();//v.Insert(2,6);//v.PrintVector();//能插入,但是会破坏掉后面的数,并且会越界访问v.Erase(5);v.PrintVector();v.Find(2);v.Front(); v.Back();}int main(){FunTest();system("pause");return 0;}

接下来是测试结果:


原创粉丝点击