一个自己实现的Vector(只能处理基本类型数据)

转载自: https://www.ev0l.art/index.php/archives/22/

  • string 类型不行

  • bool char* int double float long long 等基本类型可用

  • 使用模板类实现。底层为数组实现。

  • dvector.h

#ifndef DVECTOR_H
#define DVECTOR_H
#pragma once
#include <iostream>
template <class T>
class dvector
{
public:
dvector();
~dvector();
bool push_back(T);
void show(); public:
T* p;
int len;
int real_len; }; #endif // DVECTOR_H
  • dvector.cpp
#include "dvector.h"

template <class T>
dvector<T>::dvector()
{
len=real_len =0;
p=nullptr;
} template<class T>
dvector<T>::~dvector()
{
if(p!=nullptr)
{
delete []p;
p=nullptr;
}
} template <class T>
void dvector<T>::show()
{
if(p!=nullptr)
{
for(int i=0;i<real_len;i++){
std::cout<<i<<"\t"<<*(p+i)<<std::endl;
} std::cout<<"length="<<real_len<<std::endl;
}else { std::cout<<"NNNNNNNNNNNNNNNNNNNNNNNNNNo thing"<<std::endl;
}
} template<class T>
bool dvector<T>::push_back(T t){ if(p==nullptr)
{
//第一个为空说明只有一个元素
p=new T;
*p=t;
real_len=len=1;
}else { //第一个不为空说明有多个元素,这时候链表就必须重新分配内存
//分配为数组形式
T *ptemp = new T[real_len+1];
for(int i=0;i<real_len;i++)
{
*(ptemp+i)=*(p+i); }
*(ptemp+real_len)=t;
delete []p;
p=ptemp;
real_len+=1;
len+=1;
} return true; } int main()
{
//测试基本类型
//string 会出错,因为string 不是基本类型,是一种类似 vector 的类模板,其内部的内存操作与基本类型不一样。
//1. int
dvector<int>* dv1=new dvector<int>;
dv1->push_back(12);
dv1->push_back(15);
dv1->push_back(1995);
dv1->push_back(200);
dv1->push_back(2);
dv1->push_back(1); dv1->show(); //2. double
dvector<double>* dv2=new dvector<double>;
dv2->push_back(12.2);
dv2->push_back(15.3);
dv2->push_back(1995.0220);
dv2->push_back(200.1);
dv2->push_back(2.3);
dv2->push_back(1.9); dv2->show(); //3. char*
dvector<char*>* dv3=new dvector<char*>;
dv3->push_back("nimei");
dv3->push_back("de");
dv3->push_back("垃圾");
dv3->push_back("95");
dv3->push_back("lalala");
dv3->push_back("45"); dv3->show();
return 0;
}

晚上完善 增加了 删 改 查

- 和尹成老师视频里面写的不一样。。自己写的。反正就是不规范就是了
  • dvector.h
#ifndef DVECTOR_H
#define DVECTOR_H
#pragma once
#include <iostream>
template <class T>
class dvector
{
public:
dvector();
~dvector();
bool push_back(T);
bool del(T);
bool modify(T, T);
int search(T t);
void show(); public:
T* p;
int len;
int real_len; }; #endif // DVECTOR_H
  • dvector.cpp
#include "dvector.h"

using namespace std;

template <class T>
dvector<T>::dvector()
{
len=real_len =0;
p=nullptr;
} template<class T>
dvector<T>::~dvector()
{
if(p!=nullptr)
{
delete []p;
p=nullptr;
}
} //遍历输出
template <class T>
void dvector<T>::show()
{
if(p!=nullptr)
{
for(int i=0;i<real_len;i++){
std::cout<<i<<"\t"<<*(p+i)<<std::endl;
} std::cout<<"length="<<real_len<<std::endl;
}else { std::cout<<"NNNNNNNNNNNNNNNNNNNNNNNNNNo thing"<<std::endl;
}
} //增
template<class T>
bool dvector<T>::push_back(T t){ if(p==nullptr)
{
//第一个为空说明只有一个元素
p=new T;
*p=t;
real_len=len=1;
}else { //第一个不为空说明有多个元素,这时候链表就必须重新分配内存
//分配为数组形式
T *ptemp = new T[real_len+1];
for(int i=0;i<real_len;i++)
{
*(ptemp+i)=*(p+i); }
*(ptemp+real_len)=t;
delete []p;
p=ptemp;
real_len+=1;
len+=1;
} return true; } //查 返回查找到的序号
template <class T>
int dvector<T>::search(T t)
{
if (p ==nullptr)
{
std::cout << "The dvector is empty ,abort!" << std::endl;
return false;
}
else
{
for (size_t i = 0; i < real_len; i++)
{
if (*(p+i) == t)
{
cout << "FIND " << t << "at the position of " << i<<" " << endl;
return i; }
} cout << "no such a thing" << endl;
return -1; } return -1; } //删
template <class T>
bool dvector<T>::del(T t)
{ if (p == nullptr)
{
std::cout << "The dvector is alreafy empty ,abort!" << std::endl;
return false;
}
else
{
for (size_t i = 0; i < real_len; i++)
{
if (*(p + i) == t)
{
cout << "Deleting" << endl;
cout << "FIND " << t << "at the position of " << i << " " << endl; //如果是在第一个的情况
if (i == 0)
{
for (size_t i = 0; i < real_len; i++)
{
if (real_len == 1) //如果是只剩一个而且刚好第一个是要删除的
{
delete p;
p == nullptr;
real_len -= 1;
return true; }
else
{ //还有多个且第一个是要删除的
T* tmp = new T[real_len - 1];
for (size_t k = 0; k < real_len-1; k++)
{
*(tmp + k) = *(p + k + 1);
} delete[]p;
p = tmp;
real_len -= 1;
return true;
} } }
else if (i== real_len-1) //最后一个匹配要删除的时候
{
p + i == nullptr;
real_len -= 1;
}
else //在中间的情况
{ T* tmp = new T[real_len - 1];
for (size_t k = 0; k < i ; k++)
{
*(tmp + k) = *(p + k);
}
// 利用两个循环刚好跳过下标为i 的值 k 为原来的p 中的值,tmp+k-i 为新数组中的下标
for (size_t k = i+1; k < real_len; k++)
{
*(tmp + k - 1) = *(p + k); } delete[]p;
p = tmp;
real_len -= 1;
return true; } }
} cout << "no such a thing,Delete failed!" << endl;
return false; } } //改
template <class T>
bool dvector<T>::modify(T origin, T mo)
{ if (p == nullptr)
{
std::cout << "The dvector is empty ,abort!" << std::endl;
return false;
}
else
{
for (size_t i = 0; i < real_len; i++)
{
if (*(p + i) == origin)
{
cout << "Modifying" << endl;
cout << "FIND " << origin << "at the position of " << i << " " << endl; *(p + i) = mo; }
} cout << "no such a thing ,Modify failed!" << endl;
return false; } return -1; } int main()
{
//测试基本类型
//string 会出错,因为string 不是基本类型,是一种类似 vector 的类模板,其内部的内存操作与基本类型不一样。
//1. int
dvector<int>* dv1=new dvector<int>;
dv1->push_back(12);
dv1->push_back(15);
dv1->push_back(1995);
dv1->push_back(200);
dv1->push_back(2);
dv1->push_back(1); dv1->show(); //dv1->search(200);
//dv1->search(1000);
dv1->del(12);
dv1->show();
dv1->del(1995);
dv1->show();
dv1->del(1);
dv1->show(); dv1->modify(15, 33);
dv1->modify(200, 1);
dv1->modify(100, 1);
dv1->show(); // cout<<"next............"<<endl<<endl;
// //2. double
// dvector<double>* dv2=new dvector<double>;
// dv2->push_back(12.2);
// dv2->push_back(15.3);
// dv2->push_back(1995.0220);
// dv2->push_back(200.1);
// dv2->push_back(2.3);
// dv2->push_back(1.9);
//
// dv2->show();
//
// dv2->search(1.9);
//
// cout << "next............" << endl << endl;
//
// //3. char*
// dvector<const char*>* dv3=new dvector<const char*>;
// dv3->push_back("nimei");
// dv3->push_back("de");
// dv3->push_back("垃圾");
// dv3->push_back("95");
// dv3->push_back("lalala");
// dv3->push_back("45");
//
//dv3->show();
//dv3->search("nimei");
//cout << "next............" << endl << endl; std::cin.get();
return 0;
}

一个自己实现的Vector 完善版本的更多相关文章

  1. 给WPF示例图形加上方便查看大小的格子之完善版本

    原文:给WPF示例图形加上方便查看大小的格子之完善版本 去年10月份, 我曾写过一篇"给WPF示例图形加上方便查看大小的格子"的BLOG(http://blog.csdn.net/ ...

  2. 一个自己实现的Vector(只能处理基本类型数据)

    一个自己实现的Vector(只能处理基本类型数据) string 类型不行 bool char* int double float long long 等基本s类型可用 使用模板类实现.底层为数组实现 ...

  3. iOS----友盟分享完善版本

    分享 详细集成 注意:1.线上集成文档的示例代码对应的是最新版本的SDK,如果你所用的SDK版本类名或者方法名与此文档不符合,请看随包里面的线下文档或者下载使用最新版本的SDK. 设置友盟appkey ...

  4. Virtualenv: 一个Python环境管理工具(windown版本)

    1.安装virtualenv 在安装virtualenv之前,我们需要安装至少有一个版本的python:因为virtualenv是python的一个第三方模块,必须基于python环境才能安装: 如果 ...

  5. 一个fork短码的扩展版本

    原本代码: 链接 int skip = !!fork() + 2*(!!fork()); for (uint32_t i=skip;i!=INT_MAX;i+=4) { } 这个是多进程加速循环的代码 ...

  6. HttpDNS的坑以及一个针对安卓不太完善的测试方案

    背景:单位因为域名劫持(具体表象是某个地区的用户ping不通域名或者因为DNS解析的ip跨网段导致访问速度很慢)需要运维经常去定位,于是提出了httpDNS方案. 想法是美好的,现实是残酷的.没引入这 ...

  7. 一个suse11 sp1的crash工具版本问题

    这几年排查的各种类型的crash也比较多了,各种类型的也算见过,但是排查这个crash,走了不该走的弯路,事后显得很low,为了防止自己犯类似错误,也同时提醒后人,记录之. 内核是suse11,sp1 ...

  8. 一个linux内核模块移植到低版本时发生的异常

    在3.10的内核版本下,有一个运行稳定的内核模块,移植到suse11的时候,编译正常,运行则直接出现crash: <>[ <>[ 503.347300] Modules lin ...

  9. 用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数.

    1. 下载windows版本的redis 2.开发环境vs2017  新建一个 .net core控制台. private static Socket socket = new Socket(Addr ...

随机推荐

  1. PAT A1135 Is It A Red Black Tree

    判断一棵树是否是红黑树,按题给条件建树,dfs判断即可~ #include<bits/stdc++.h> using namespace std; ; struct node { int ...

  2. ubuntu16.04下安装docker和docker-compose

    开始安装 由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本:$ sudo apt-get remove docker docker-engine docker-ce dock ...

  3. 夯实Java基础(十九)——集合

    1.前言 集合在Java中的地位想必大家都知道,不用多BB了.无论是在我们现在的学习中还是在今后的工作中,集合这样一个大家族都无处不在,无处不用.在前面讲到的数组也是一个小的容器,但是数组不是面向对象 ...

  4. python爬虫(四) 内涵段子

    import requests import time import json from urllib import request from urllib import parse url = 'h ...

  5. windows通过zip安装mysql5.7.26的一个坑

    需要将my.ini的 红框的/不能写成\ 注意编码格式问题 然后 mysqld --initialize-insecure mysqld --install net start mysql

  6. 奈奎斯特采样定理(Nyquist)

    采样定理在1928年由美国电信工程师H.奈奎斯特首先提出来的,因此称为奈奎斯特采样定理. 1933年由苏联工程师科捷利尼科夫首次用公式严格地表述这一定理,因此在苏联文献中称为科捷利尼科夫采样定理. 1 ...

  7. 1016 部分A+B (15 分)

    正整数 A 的“D​A​​(为 1 位整数)部分”定义为由 A 中所有 D​A​​ 组成的新整数 P​A​​.例如:给定 8,D​A​​=6,则 A 的“6 部分”P​A​​ 是 66,因为 A 中有 ...

  8. HashSet原理

  9. AI算法工程师炼成之路

    AI算法工程师炼成之路 面试题: l  自我介绍/项目介绍 l  类别不均衡如何处理 l  数据标准化有哪些方法/正则化如何实现/onehot原理 l  为什么XGB比GBDT好 l  数据清洗的方法 ...

  10. SpringMVC:自定义视图及其执行过程

    一:自定义视图 1.自定义一个实现View接口的类,添加@Component注解,将其放入SpringIOC容器 package com.zzj.view; import java.io.PrintW ...