手写vector
看过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;
}
手写vector的更多相关文章
- 使用神经网络来识别手写数字【译】(三)- 用Python代码实现
实现我们分类数字的网络 好,让我们使用随机梯度下降和 MNIST训练数据来写一个程序来学习怎样识别手写数字. 我们用Python (2.7) 来实现.只有 74 行代码!我们需要的第一个东西是 MNI ...
- stanford coursera 机器学习编程作业 exercise 3(使用神经网络 识别手写的阿拉伯数字(0-9))
本作业使用神经网络(neural networks)识别手写的阿拉伯数字(0-9) 关于使用逻辑回归实现多分类问题:识别手写的阿拉伯数字(0-9),请参考:http://www.cnblogs.com ...
- 学习OpenCV——SVM 手写数字检测
转自http://blog.csdn.net/firefight/article/details/6452188 是MNIST手写数字图片库:http://code.google.com/p/supp ...
- 【OpenCV】opencv3.0中的SVM训练 mnist 手写字体识别
前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的 ...
- 基于opencv的手写数字识别(MFC,HOG,SVM)
参考了秋风细雨的文章:http://blog.csdn.net/candyforever/article/details/8564746 花了点时间编写出了程序,先看看效果吧. 识别效果大概都能正确. ...
- opencv 手写选择题阅卷 (二)字符识别
opencv 手写选择题阅卷 (二)字符识别 选择题基本上只需要识别ABCD和空五个内容,理论上应该识别率比较高的,识别代码参考了网上搜索的代码,因为参考的网址比较多,现在也弄不清是参考何处的代码了, ...
- opencv 手写选择题阅卷 (三)训练分类器
opencv 手写选择题阅卷 (三)训练分类器 1,分类器选择:SVM 本来一开始用的KNN分类器,但这个分类器目前没有实现保存训练数据的功能,所以选择了SVN分类器; 2,样本图像的预处理和特征提取 ...
- (手写识别) Zinnia库及其实现方法研究
Zinnia库及其实现方法研究 (转) zinnia是一个开源的手写识别库.采用C++实现.具有手写识别,学习以及文字模型数据制作转换等功能. 项目地址 [http://zinnia.sourcefo ...
- 利用神经网络算法的C#手写数字识别
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载Demo - 2.77 MB (原始地址):handwritten_character_recognition.zip 下载源码 - 70. ...
随机推荐
- UVA - 11795 状压DP
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #i ...
- mysql一些简单操作
创建数据库,删除数据库 create database databasename charset utf8 collate utf8_general_ci;设置字符集utf8,校对规则utf8_gen ...
- js中点和向量的基本方法
var Point=function(x,y){ this.x= Number(x.toFixed(2))||0; this.y=Number(y.toFixed(2))||0; } Point.pr ...
- UVa 253
UVa 253 #include <iostream> #include <cstdio> #include <string> #include <cstri ...
- ecmall模板编辑中的标题如何自定义读取
碰见了一个问题,刚上线的ecmall项目.客户说标题不要商城首页这四个字. 我去源码里找,找了半天才找到. 问题描述如下: 找到title的最原始模板themes\mall\tmall\top.htm ...
- 安装Newton版Glance
Image Service 本文介绍在controller节点上安装.配置Image服务 glance,镜像存储在本地文件系统 安装准备 controller 节点 ip:192.168.81.11 ...
- Unity3d Attribute 总结
举两个例子,在变量上使用[SerializeFiled]属性,可以强制让变量进行序列化,可以在Unity的Editor上进行赋值. 在Class上使用[RequireComponent]属性,就会在C ...
- 关于GBK、GB2312、UTF8之间的区别
UTF-8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM.是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为( ...
- python爬取英语学习资料并发送邮件
新建发送邮件类 import smtplib from email.mime.text import MIMEText from email.header import Header class Se ...
- js简单时分秒倒计时
效果: javascript: <script type="text/javascript"> function countTime() { //获取当前时间 var ...