108次练习之模拟实现STL中的Vector

Posted 数据结构专题_By_高小调

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了108次练习之模拟实现STL中的Vector相关的知识,希望对你有一定的参考价值。

  之前敲过很多遍的Vector就不算了,从现在开始,每次将敲过的次数记下来,直至108遍为止.(瑜伽做108遍拜日,在此借助瑜伽的思想)  

  为什么要敲这么多次?借助NLP中的一句话:最基础的就是最精华的!

  为什么偏偏要敲108遍?借助瑜伽中108遍拜日的思想.

  本文仅供个人学习,总结.....

  废话不多说...开干!

/*
*文件说明:模拟STL的Vector相关声明及实现(第1遍)
*作者:高小调
*日期:2016-12-18
*集成开发环境:Microsoft Visual Studio 2010 
*/
#ifndef __VECTOR1_H__
#define __VECTOR1_H__
template<typename T>
class Vector{
public:
	typedef T* Iterator;
	typedef const T * ConstIterator;
public://默认成员函数
	//构造函数
	Vector()
		:_start(NULL)
		,_finish(NULL)
		,_endofstorgy(NULL){}
	//拷贝构造
	Vector(const Vector & v)
		:_start(NULL)
		,_finish(NULL)
		,_endofstorgy(NULL){
			if(v._arr != NULL){					//被拷贝对象不为空
				size_t size = v.Size();			//有效元素个数
				size_t capacity = v.Capacity();	//容量
				_arr = new T[capacity];			//开辟内存
				_Copy(_arr,v.Begin(),v.End());	//拷贝数据
				_finish = _arr + size;			//更新_finish
				_endofstorgy = _arr + capacity;	//更新_endofstorgy
			}
	}
	//赋值运算符重载
	Vector & operator=(const Vector &v){
		if(_arr!=v._arr){
			Vector tmp(v);
			_Swap(v);
		}
	}
	//析构函数
	~Vector(){
		_Destory();
	}
public://公共接口函数
	//尾插
	void PushBack(const T & e){
		Insert(End(),e);
	}
	//尾删
	void PopBack(){
		Erase(End());
	}
	//插入单个元素
	void Insert(Iterator pos,const T &e){
		size_t sub = pos-_start;	//记录当前位置与_finish的相对距离
		_CheckCapacity();			//扩容检测及处理
		pos = _start + sub;			//更新pos,防止扩容后迭代器失效
		Iterator It = _finish;
		while(pos<It){
			*It = *(It-1);			//移动数据
			--It;
		}
		*pos = e;					//插入数据
		_finish++;					//更新——_finish
	}
	//删除一个元素
	void Erase(Iterator pos){
		if(Empty()){
			assert(false);			//当前Vector为空
			return ;
		}
		Iterator Cur = pos;
		Iterator end = End();
		while(Cur<end){
			*Cur = *(Cur+1);		//循环覆盖Cur位置数据
			Cur++;
		}
		--_finish;					//更新_finish
	}
	//判断是否为空
	bool Empty(){
		return (_start==_finish);
	}
	//有效元素个数
	size_t Size(){
		return _finish-_start;
	}
	//容量
	size_t Capacity(){
		return _endofstorgy-_start;
	}
	//下标运算符重载
	T &operator[](size_t index){
		assert(index<Size());
		return _start[index];
	}
	const T &operator[](size_t index)const{
		assert(index<Size());
		return _start[index];
	}
public://迭代器相关操作
	Iterator Begin(){
		return _start;
	}
	ConstIterator Begin()const{
		return _start;
	}
	Iterator End(){
		return _finish;
	}
	ConstIterator End()const{
		return _finish;
	}
private:
	//检测扩容及处理
	void _CheckCapacity(){
		size_t OldSize = Size();
		size_t OldCapacity = Capacity();
		if(OldSize==OldCapacity){
			size_t NewCapacity = OldCapacity*2+3;
			Iterator NewArr = new T[NewCapacity];
			if(_start!=NULL){
				_Copy(NewArr,Begin(),End());
				delete[] _start;
			}
			_start = NewArr;
			_finish = _start + OldSize;
			_endofstorgy = _start + NewCapacity;
		}
	}
	//拷贝
	void _Copy(Iterator dst,Iterator start,Iterator end){
		while(start!=end){
			*dst++ = *start++;
		}	
	}
	//交换
	void _Swap(const Vector &v){
		swap(_start,v._start);
		swap(_finish,v._finish);
		swap(_endofstorgy,v._endofstorgy);
	}
	//销毁
	void _Destory(){
		if(_start!=NULL){
			delete[] _start;
			_start = _finish = _endofstorgy = NULL;
		}
	}
private:
	Iterator _start;		//起始位置
	Iterator _finish;		//有效数据结束位置
	Iterator _endofstorgy;	//结束位置
};
#endif

 

/*
*文件说明:测试Vector相关函数
*作者:高小调
*日期:2016-12-18
*集成开发环境:Microsoft Visual Studio 2010 
*/
#include<iostream>
#include<assert.h>
using namespace std;
#include"Vector1.h"
//测试函数
void VectorTest(){
	Vector<int> v1;
	//测试PushBack、_CheckCapacity、Insert函数
	v1.PushBack(1);
	v1.PushBack(2);
	v1.PushBack(4);
	v1.PushBack(5);
	v1.Insert(v1.Begin(),0);
	v1.Insert(v1.Begin()+3,3);
	//测试Begin、End、函数
	Vector<int>::Iterator It1 = v1.Begin();
	while(It1!=v1.End()){
		cout<<*It1<<" ";
		++It1;
	}
	cout<<endl;
	//测试Erase函数
	v1.PopBack();			//尾删 5
	v1.Erase(v1.Begin());	//头删 0
	v1.Erase(v1.Begin()+2);	//删除中间元素 3
	//测试Size函数、[]重载
	for(size_t i=0; i<v1.Size();++i){
		cout<<v1[i]<<" ";
	}
	cout<<endl;
}
int main(){
	VectorTest();
	return 0;
}

BUG总结:

  据上次敲Vector过了11天,有些东西还是有些遗忘.

  1.重载const与迭代器相关函数时,忘了给函数名后面加const

  2.在插入函数中,防止迭代器失效,那个sub,莫名其妙的一开始想成了_finish-pos

  3.想了半天Insert插入一段区间函数该怎么写,突然想到这个东西是List里的.

  今天...就到这里了!

以上是关于108次练习之模拟实现STL中的Vector的主要内容,如果未能解决你的问题,请参考以下文章

模拟实现stl中的list

STL-vector 模板类 模拟实现

C++:STL——vector的模拟实现

C++STL第二篇:vector类的介绍及模拟实现

C++STL第二篇:vector类的介绍及模拟实现

C++STL之vector的使用和实现