一个自己实现的Vector 完善版本
一个自己实现的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 完善版本的更多相关文章
- 给WPF示例图形加上方便查看大小的格子之完善版本
原文:给WPF示例图形加上方便查看大小的格子之完善版本 去年10月份, 我曾写过一篇"给WPF示例图形加上方便查看大小的格子"的BLOG(http://blog.csdn.net/ ...
- 一个自己实现的Vector(只能处理基本类型数据)
一个自己实现的Vector(只能处理基本类型数据) string 类型不行 bool char* int double float long long 等基本s类型可用 使用模板类实现.底层为数组实现 ...
- iOS----友盟分享完善版本
分享 详细集成 注意:1.线上集成文档的示例代码对应的是最新版本的SDK,如果你所用的SDK版本类名或者方法名与此文档不符合,请看随包里面的线下文档或者下载使用最新版本的SDK. 设置友盟appkey ...
- Virtualenv: 一个Python环境管理工具(windown版本)
1.安装virtualenv 在安装virtualenv之前,我们需要安装至少有一个版本的python:因为virtualenv是python的一个第三方模块,必须基于python环境才能安装: 如果 ...
- 一个fork短码的扩展版本
原本代码: 链接 int skip = !!fork() + 2*(!!fork()); for (uint32_t i=skip;i!=INT_MAX;i+=4) { } 这个是多进程加速循环的代码 ...
- HttpDNS的坑以及一个针对安卓不太完善的测试方案
背景:单位因为域名劫持(具体表象是某个地区的用户ping不通域名或者因为DNS解析的ip跨网段导致访问速度很慢)需要运维经常去定位,于是提出了httpDNS方案. 想法是美好的,现实是残酷的.没引入这 ...
- 一个suse11 sp1的crash工具版本问题
这几年排查的各种类型的crash也比较多了,各种类型的也算见过,但是排查这个crash,走了不该走的弯路,事后显得很low,为了防止自己犯类似错误,也同时提醒后人,记录之. 内核是suse11,sp1 ...
- 一个linux内核模块移植到低版本时发生的异常
在3.10的内核版本下,有一个运行稳定的内核模块,移植到suse11的时候,编译正常,运行则直接出现crash: <>[ <>[ 503.347300] Modules lin ...
- 用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数.
1. 下载windows版本的redis 2.开发环境vs2017 新建一个 .net core控制台. private static Socket socket = new Socket(Addr ...
随机推荐
- JS开发中的各大技巧
「String Skill」:字符串技巧 「Number Skill」:数值技巧 「Boolean Skill」:布尔技巧 「Array Skill」:数组技巧 「Object Skill」:对象技巧 ...
- hadoop程序理解
1.利用hadoop的API写程序 驱动程序中利用hadoop的API,获取配置,默认会根据HADOOP_HOME环境变量指定的HADOOP主目录下/etc/hadoop加载配置文件 2.启动利用 - ...
- nginx sendfile 相关知识
https://blog.csdn.net/wm_1991/article/details/51916027
- Codeforces Round #586 (Div. 1 + Div. 2)D(二分图构建,思维,结论需数论证明)
#include<bits/stdc++.h>using namespace std;long long a[200007];vector<int>v[77];int main ...
- 时间和日期-<Date和SimpleDateFormat>
第一步.定义一个Date //获取当前时间 Date now=new Date(); 第二步.定义一个SimpleDateFormat //规范时间格式 SimpleDateFormat date=n ...
- 解题报告:luogu P1196 [NOI2002]银河英雄传说
由于并查集让我很自闭(其实是我太弱了),所以学习了加权并查集,这是例题: 题目链接:P1196 [NOI2002]银河英雄传说 不是很简单,但对于大佬还是签到题. 合并与路径压缩时直接维护\(dis[ ...
- 零基础学完Python的7大就业方向,哪个赚钱多?
“ 我想学 Python,但是学完 Python 后都能干啥 ?” “ 现在学 Python,哪个方向最简单?哪个方向最吃香 ?” “ …… ” 相信不少 Python 的初学者,都会遇到上面的这些问 ...
- 三 Spring对于延迟加载问题的解决
Spring提供了延迟加载问题的解决方法 什么是延迟加载? 延迟加载:lazy(懒加载) 执行到该行代码的时候不会发送语句,真正使用这个对象的属性的时候才会发送sql语句进行查询. 类级别延迟加载:指 ...
- win7/10获取本地wifi密码明文
win7 单击右下角无线网图标,选择已连接的无线网 右击无线网名称,选择属性 点击标题栏的安全,再点击显示字符,即可显示wifi密码明文 win10 控制面板[查看方式选类别]-查看网络状态和任务 点 ...
- pytorch 调整tensor的维度位置
target.permute([0, 3, 1, 2]) 一定要使用permute以及中括号 一些在我这里没起到作用的网上的例子: 1. https://blog.csdn.net/zouxiaolv ...