vector类
首先明确完成一个最基本的vector类需要实现什么
实现之前应该思考 vector的ADT应该是什么样的
- 指针(用于遍历?)
- 容量
- 数据
- 线性排列
构造函数
默认构造函数
有参构造函数
析构函数
增加元素 :push_back()
删除元素:erase()
厉害完整的能写到 一千多行去,考虑到很多情况(异常...)
目前参考的是一个精简的小实现 github上开源的那个写得太高级,需要时间去消化。
这个版本的思路大致是:
逐步完成
比如说:有参构造函数需要添加元素需要调用push_back()函数,而push_back()函数需要调用insert_after函数(),insert_after()函数是insert_before函数的包装,insert_before需要判断
当前的容量与大小是否相同(即满了没有), 然后就需要用allocator函数分配内存空间,new T[大小] 需要删除 delete[] 地址名。
代码:
//防止重复定义 //#pragma once /* #ifndef __ZB_VECTOR_H__ #define __ZB_VECTOR_H__ */ //依赖的库 #include <iostream> #include <algorithm> //#include <assert.h> using namespace std; //模板 template <class T> class zb_vector { private: //容器步进值 #define WORK_LENGTH 64 public: //构造函数 zb_vector():zb_size(0),zb_capa(0),zb_data(nullptr){} zb_vector(int n,const T& data):zb_size(0),zb_capa(0),zb_data(nullptr){ cout << " push_back" <<endl; while(n--) { push_back(data); cout << " push_back" <<endl; } } //析构函数 ~zb_vector(){ //#pragma warning } void push_back(const T& data){ insert_after(zb_size-1,data); } void insert_after(const int pos,const T& data){ insert_before(pos+1,data); } void insert_before(const int pos,const T& data){ if(zb_size == zb_capa) { T* temp = zb_data; zb_capa += WORK_LENGTH; zb_data = zb_allocator(zb_capa); memcpy(zb_data,temp,zb_size*sizeof(T)); zb_deallocator(temp); } for(int i=(int)zb_size++;i>pos;i--) { zb_data[i] = zb_data[i-1]; } zb_data[pos] = data; //zb_size++; } private: T* zb_allocator(const unsigned int& zb_capa){ return new T[zb_capa]; } void zb_deallocator(T* arr){ if(arr) delete[] arr; } private: int zb_size; int zb_capa; T* zb_data; };
本文来自博客园,作者:快乐过了阈值,转载请注明原文链接:https://www.cnblogs.com/black-worrior-2000/p/16514813.html
墨愁前路无知己,天下谁人不识君。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)