手写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. ...
随机推荐
- 洛谷 P2495 [SDOI2011]消耗战(虚树,dp)
题面 洛谷 题解 虚树+dp 关于虚树 了解一下 具体实现 inline void insert(int x) { if (top == 1) {s[++top] = x; return ;} int ...
- HDU6393(LCA + RMQ + 树状数组) n边图,两点最短距离 , 修改边权
这道题的进阶版本 进阶版本 题意: 一个n个点,n条边的图,2中操作,1是将某条边的权值更改,2是询问两点的最短距离. 题解: 由于n个点,n条边,所以是树加一个环,将环上的边随意取出一条,就是1颗树 ...
- POJ - 1845 简单数论
求A^B的约数和模MOD 对A质因子分解P1^k1*P2^k2....P^kn A^B既指数对应部分乘以B 对于每个P都有(1+P^1+P^2+...+P^ki)的选择 连乘每一个P的等比数列之和即可 ...
- 03-树3 Tree Traversals Again (25 分)
An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example ...
- Flask项目出现html文件无法自动补全
默认情况下我们使用Pycharm专业版创建一个Flask项目时就会自动创建一个简单的项目结构,Pycharm会自动关联起文件的语法,模版等.而自己手动创建的文件并没有关联起来.这就会出现上面说的无法补 ...
- PIE SDK栅格数据的金字塔创建
1. 功能简介 金字塔可用于改善性能,可以加快栅格数据的显示速度.随着放大操作的进行,各个更精细的分辨率等级将逐渐得到绘制;但性能将保持不变:目前PIE SDK支持栅格数据的金字塔创建,下面对栅格数据 ...
- GreenPlum 大数据平台--运维(二)
.如何获取查询运行时和已用时间. 例子: Select tstart, tfinish, (tfinish-tstart) as total_time, trim(query_text) from q ...
- Docker_network相关指令
docker network create创建docker网卡docker network create -d overlay --ip-range=192.168.2.0/24 --gateway= ...
- 内行看门道:看似“佛系”的《QQ炫舞手游》,背后的音频技术一点都不简单
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 3月14日,腾讯旗下知名手游<QQ炫舞>正式上线各大应用商店,并迅速登上App Store免 ...
- C++程序设计基础(2)变量
注:读<程序员面试笔记>笔记总结 1.知识点 (1)C++变量命名只能包含字母.数字.下划线,其中开头不能是数字:大小写敏感:习惯上变量用小写字母,常量.宏定义用大写字母. (2)变量的作 ...