c++模拟实现vector

上一篇说到了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<_size
	if (size < _size)
		_size = size;
	// size > _size
	else if (size>_size)
	{
		int _oldsize = _size;
		_size = size;
		while (1)
		{
			//_size < size < _capacity
			if (size < _capacity)
				break;
			else
				CheckCapacity();
		}
		//size > _capacity
		for (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;
}

接下来是测试结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值