之前敲过很多遍的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();          //尾删 5v1.Erase(v1.Begin()); //头删 0v1.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里的.

  今天...就到这里了!

转载于:https://www.cnblogs.com/shujujiegou/p/6195496.html

108次练习之模拟实现STL中的Vector(一)相关推荐

  1. C++ STL : 模拟实现STL中的vector类

    文章目录 vector vector的介绍 vector的优缺点 实现时需要注意的细节问题 1. Capacity增长问题 2. memset等函数来带的按字节拷贝问题 3. 深浅拷贝问题 4. 迭代 ...

  2. C++ STL : 模拟实现STL中的关联式容器unordered_map/unordered_set

    目录 unordered_map/unordered_set unordered_map/unordered_set与map/set的区别 底层哈希桶的改造 仿函数 Key值的获取方法 hash(ke ...

  3. C++ STL : 模拟实现STL中的容器适配器stack和queue

    目录 什么是容器适配器 stack stack的文档介绍-(来自cplusplus) stack的实现 queue queue的文档介绍-(来自cplusplus) queue的实现 什么是容器适配器 ...

  4. C++ STL : 模拟实现STL中的list类

    文章目录 list list的介绍 list的优缺点 list的迭代器失效问题 实现的接口 节点部分 迭代器部分 list部分 代码实现 list list的介绍 list的文档介绍 list是可以在 ...

  5. C++ STL : 模拟实现STL中的关联式容器map和set

    目录 关联式容器 键值对 底层红黑树的改造 仿函数 红黑树的迭代器 完整代码 set set的文档介绍 set的实现 map map的文档介绍 map的实现 operator[] 完整代码 multi ...

  6. C++ STL : 模拟实现STL中的容器适配器priority_queue

    目录 priority_queue 文档介绍 实现思路 思路 仿函数 实现 priority_queue 文档介绍 文档介绍 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含 ...

  7. C++ STL : 模拟实现STL中的string类

    string的文档介绍 string是表示字符序列的类 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作 单字节字符字符串的设计特性. string类是使用c ...

  8. 模拟实现STL中map和set容器

    红黑树的迭代器 //红黑树的迭代器 template<class T> struct RBTreeIterator {typedef RBTreeNode<T>Node;typ ...

  9. STL中map/vector的删除元素操作

    在我们使用C++中的STL的时候,可以使用迭代器iterator进行遍历,但是当我们通过iterator对vector和map删除元素的时候,要格外的小心,往往操作不当,导致iterator失效,后果 ...

  10. C++STL中的vector

    vector 容器 vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说: ...

最新文章

  1. Linux2.6--虚拟文件系统
  2. idc网站html源码,40个网页常用小代码
  3. java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContextAware
  4. Ubuntu 安装Jdk(apt-get)
  5. magento: configurable 显示所有属性及获取 Json Config how to get Json Config by product id
  6. python des加密文件_python DES3 加密解密
  7. c语言switch编写个人所得税,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  8. 简述java 内存回收机制_简单介绍Java垃圾回收机制
  9. houseprice_analysis_广州房子租售比分析(上)
  10. Android开发:toast封装工具类
  11. VMware安装CentOS8简单教程
  12. 万能素材库_2016万能高考作文素材大全
  13. csr_matrix详细解读
  14. 【5G MAC】RA-RNTI的计算过程
  15. GVS视声引入睿住资本,完成A轮融资
  16. 2016 -Nginx的负载均衡 - 一致性哈希 (Consistent Hash)
  17. 浅谈Spring框架AOP概念
  18. 中科曙光新型算力,构建数字设施大动脉
  19. Julia安装与运行
  20. 拦截用户刷新或离开页面

热门文章

  1. css基础知识汇总3
  2. opencv ret, binary = cv2.threshold(src, 180, 255, )二值化的类型
  3. Could not find a version that satisfies the requirement torch==1.4.0 (from torchvision)
  4. 网络安全:个人网站防黑安全技巧
  5. python实现寻找最长回文子序列
  6. 2021-07-09商场主页及分类
  7. access日期如何增加年数_MATLAB的时间与日期
  8. C++11多线程中的detach()、join()、joinable()
  9. 【Django 2021年最新版教程20】python for循环遍历queryset
  10. CMakeLists.txt是什么