标签:个人 finish 容量 tor int empty nlp 总结 return
之前敲过很多遍的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里的.
今天...就到这里了!
标签:个人 finish 容量 tor int empty nlp 总结 return
原文地址:http://www.cnblogs.com/shujujiegou/p/6195496.html