手写vector
2024-08-29 09:46:23
看过JDK源码,现在自己想实现一个vector。
最开始的时候,我大概构想了一下怎么设计,一种是设置一个指针数组来存放对象,这样修改的时候可以不用大量的元素复制,但后来仔细想了想,它需要设置一个额外的位示图显示对应位置的元素情况,不划算,所以最终也是采取了JDK源码的设计思路。即,数组初始长度设置为10,以后快溢出之前将数组扩容为原先的1.5倍。
#include <iostream>
#include <cstring>
using namespace std;
class Vector {
private :
int *myVector;
int vectorSize;
int length; // if vectorSize >= length need extendCapacity
public:
Vector() {
length = 10;
myVector = new int[length];
vectorSize = 0;
}
Vector(int nowSize, int value) {
vectorSize = nowSize;
length = nowSize > length ? nowSize : length;
myVector = new int[nowSize];
memset(myVector, value, nowSize);
}
~Vector() {
delete myVector;
myVector = NULL;
}
int rangeCheck(int index);
void push_back(int value);
int size();
int erase(int index);
bool empty();
int insert(int index, int value);
void show();
void ensureCapacity();
void CopyFrontToEnd(int *Dst, int from, int *Src, int start, int cnt);//从前往后复制
void CopyEndToFront(int *Dst, int from, int *Src, int start, int cnt); //从后往前复制
};
void errPrint(int errorType) {
if (errorType == 1) {
cout << "index > size\n";
}
else if(errorType == -1) {
cout << "index < 0\n";
}
}
void Vector::CopyFrontToEnd(int *Dst, int from, int *Src, int start, int cnt) {
for(int i = start; i < start + cnt; ++i) {
Dst[from++] = Src[i];
}
}
void Vector::CopyEndToFront(int *Dst, int from, int *Src, int start, int cnt) {
for(int i = start - 1; i >= start - cnt; --i) {
Dst[from--] = Src[i];
}
}
void Vector::ensureCapacity() {
if(vectorSize >= length) {
int *tmp = new int[length * 3 / 2];
length *= 3 / 2;
CopyFrontToEnd(tmp, 0, myVector, 0, vectorSize);
myVector = tmp;
}
}
int Vector::rangeCheck(int index) {
if (index > vectorSize) {
return 1;
}
if (index < 0) {
return -1;
}
return 0;
}
void Vector::push_back(int value) {
ensureCapacity();
myVector[vectorSize++] = value;
}
int Vector::size() {
return vectorSize;
}
int Vector::erase(int index) {
int checkOut = rangeCheck(index);
if(checkOut != 0)
return checkOut;
CopyFrontToEnd(myVector, index, myVector, index + 1, vectorSize - index - 1);
--vectorSize;
}
bool Vector::empty() {
return vectorSize == 0 || myVector == NULL;
}
int Vector::insert(int index, int value) {
int checkOut = rangeCheck(index);
if(checkOut != 0)
return checkOut;
ensureCapacity();
CopyEndToFront(myVector, vectorSize, myVector, vectorSize, vectorSize - index);
myVector[index] = value;
++vectorSize;
return 0;
}
void Vector::show() {
for (int i = 0; i < vectorSize; ++i) {
cout << myVector[i] << " ";
}
cout << endl;
}
void menu() {
cout << "1-push_back 2-size 3-erase 4-empty 5-insert 6-show\n";
}
void testVector(Vector myVector) {
int choice, index, value, checkOut;
menu();
while(cin >> choice) {
switch(choice) {
case 1:
cout << "cin the value you want to push_back : ";
cin >> value;
myVector.push_back(value);
break;
case 2:
cout << "vector size = " << myVector.size() << endl;
break;
case 3:
cout << "cin the index : ";
cin >> index;
checkOut = myVector.rangeCheck(index);
if(checkOut == 0)
myVector.erase(index);
else
errPrint(checkOut);
break;
case 4:
cout << "vector empty : " << myVector.empty() << endl;
break;
case 5:
cout << "cin the index and the value you want to insert: ";
cin >> index >> value;
checkOut = myVector.rangeCheck(index);
if(checkOut == 0)
myVector.insert(index, value);
else
errPrint(checkOut);
break;
case 6:
cout << "show vector : ";
myVector.show();
break;
default :
break;
}
}
}
int main(int argc, char const *argv[]) {
Vector myVector;
testVector(myVector);
return 0;
}
最新文章
- shell 计算2
- JsonUtil
- window下安装jupyter
- iOS--UIView和UIWindow用法
- 面试时被问到js的绑定事件,我居然不知道怎么回答。回来查了下,做个笔记
- PAT 1017. A除以B (20)
- PAT (Basic Level) Practise:1031. 查验身份证
- (转)开源爬虫larbin分析
- acm - cry for no one
- Android系统移植与调试之------->;如何修改Android设备的开机第一阶段Logo
- ACE_Message_Block消息数据类
- EntityFramework Core饥饿加载忽略导航属性问题
- JMeter关联的几种方式总结案例
- 配置TortoiseGit与Github
- JBPM工作流(三)——ProcessEngine与Service API
- 云笔记项目-AOP知识简单学习
- 获奖感想和Java学习总结
- laravel项目ThinkSNS+安装
- JBOSS安装与配置搭建本地项目环境(方便前端开发调式)
- Jmeter(十九)_ForEach控制器实现网页爬虫
热门文章
- Luogu P1272 重建道路 树形DP
- HDU_6298 Maximum Multiple 【找规律】
- 下载 生成 requirements
- Win10安装MySQL5.7.22解压缩版的方法及手动配置讲解
- 使用xcode测量ios8.1机型时的项目兼容问题
- Scala 中 for 循环 和 generator 的使用例子
- 爬虫之自动生成url
- python-基础学习篇(一)
- 错误:38-Corel VideoStudio文件已损坏或被修改。请重新安装原始来源解决方法。
- MVC Request.UrlReferrer为null