35.自己实现vector模板库myvector
2024-09-08 00:36:27
- myvector.h
#pragma once //自己写的vector模板库
template <class T>
class myvector
{
public:
//构造
myvector();
//析构
~myvector();
//尾插
void push_back(T t);
//索引
T *find(T t);
//改变
void change(T*pos, T t);
//删除
void del(T t);
//显示
void show();
//重载[]操作符
T operator [](int i); //指定位置插入
void insert(T findt, T t);
public:
//数据指针
T *p;
//标记内存长度
int n;
//实际长度
int realn;
}; - myvector.cpp
#include "myvector.h" //构造初始化
template <class T>
myvector<T>::myvector()
{
p = nullptr;
n = realn = ;
} //析构函数清空内存
template <class T>
myvector<T>::~myvector()
{
if (p!=nullptr)
{
delete []p;
p = nullptr;//清空
}
} //尾部插入
template <class T>
void myvector<T>::push_back(T t)
{
//如果是空指针
if (p==nullptr)
{
//分配内存
p = new T;
//赋值
*p = t;
//真实的长度和当前长度都赋值为1
realn = n = ;
}
else
{
//如果不为空则重新分配内存
T *ptemp = new T[n + ];
//拷贝到新的空间
for (int i = ; i < n;i++)
{
*(ptemp + i) = *(p + i);
}
//赋值最后一个元素
*(ptemp + n) = t;
//把原来的空间给删除
delete []p; //指向新的空间
p = ptemp; //真实长度与预留总长度都加1
realn += ;
n += ;
}
} //显示数据
template <class T>
void myvector<T>::show()
{
if (p==NULL)
{
return;
}
else
{
//遍历
for (int i = ; i < realn;i++)
{
cout << p[i] << " ";
}
cout << "\n";
}
} //查询某一个数据
template <class T>
T * myvector<T>::find(T t)
{
//遍历查询,返回指针位置
for (int i = ; i < realn; i++)
{
if (t==*(p+i))
{
return p + i;
}
}
return nullptr;
} //改变指定位置的数据
template <class T>
void myvector<T>::change(T*pos, T t)
{
//如果位置为空
if (pos==nullptr)
{
return;
}
//如果不为空
else
{
*pos = t;
}
} //删除某指定的第一个数据
template <class T>
void myvector<T>::del(T t)
{
//标识有没有找到
int pos = -;
//遍历查找,如果找到了记录位置
for (int i = ; i < realn; i++)
{
if (t == *(p + i))
{
pos = i;
break;
}
}
//如果找到
if (pos!=-)
{
//如果是最后一个元素
if (pos== realn-)
{
realn -= ;
}
//如果不是最后一个元素,则向前移动
else
{
for (int i = pos; i < realn-;i++)
{
p[i] = p[i + ];
}
realn -= ;
}
}
} //插入
template <class T>
void myvector<T>::insert(T findt, T t)
{
//如果预留长度满了
if (n == realn)
{
//找到指定位置
int pos = -;
for (int i = ; i < realn; i++)
{
if (findt == *(p + i))
{
pos = i;
break;
}
}
//如果找到了
if (pos != -)
{
//重新分配内存并拷贝
T *ptemp = new T[n + ];//重新分配内存
for (int i = ; i < n; i++)
{
*(ptemp + i) = *(p + i);//拷贝
}
//删除原数据
delete[] p;
//指向新内存
p = ptemp;
//预留长度加1
realn += ;
//真实长度加1
n += ; //指定位置数据往后移
for (int i = realn - ; i >= pos; i--)
{
p[i + ] = p[i];//往前移动
}
//要插入的位置赋值
p[pos] = t;
}
}
//如果预留的长度没有满,则不用重新分配内存
else
{
//找到指定位置
int pos = -;
for (int i = ; i < realn; i++)
{
if (findt == *(p + i))
{
pos = i;
break;
}
}
//如果找到了
if (pos != -)
{
//指定位置数据往后移
for (int i = realn - ; i >= pos; i--)
{
p[i + ] = p[i]; }
p[pos] = t;
realn += ;
}
}
} //重载[]运算符
template <class T>
T myvector<T>::operator [](int i)
{
if (i < || i>=realn)
{
return NULL;
}
return p[i];
} - main.cpp
#include <iostream>
#include<stdlib.h>
#include <vector>
#include <string>
#include "myvector.h"
#include "myvector.cpp"
using namespace std; //测试函数
void main()
{
myvector<int> myv1;
myv1.push_back();
myv1.push_back();
myv1.push_back();
myv1.push_back();
myv1.push_back();
myvector<int> myv2;
myv2.push_back();
myv2.push_back();
myv2.push_back(); myvector<int> myv3;
myv3.push_back();
myv3.push_back();
myv3.push_back();
myv3.push_back(); myvector< myvector<int>* > myvv;//自己写的模板嵌套用指针 myvv.push_back(&myv1);
myvv.push_back(&myv2);
myvv.push_back(&myv3);
myvv[]->show();
myvv[]->show();
myvv[]->show(); cout << myv1[] << endl;
cin.get(); }
最新文章
- IT软件技术人员的职位路线(从程序员到技术总监) - 部门管理经验谈
- Red Hat Enterprise Server 6.0 安装Sendmail相关包
- [Android学习笔记]理解焦点处理原理的相关记录
- MySQL数据类型总结
- Winform窗体
- C++-不要在构造和析构函数中调用虚函数
- kuangbin_UnionFind D (HDU 3038)
- CSS3 之动画及兼容性调优
- 【Nutch基础教程之七】Nutch的2种运行模式:local及deploy
- C语言中long类型,int类型
- 彻底解决Android因加载多个大图引起的OutOfMemoryError,内存溢出的问题
- 项目管理-SVN服务器的搭建
- SAP问题【转载】
- Cocos2D-X屏幕适配新解
- Spring Security入门(3-4)Spring Security 异常处理、异常传递和异常获取
- php中的public、protected、private三种访问控制模式及self和parent的区别(转)
- TopCoder SRM502 Div1 500 贪心 01背包
- CRM系统之stark组件流程分析
- Sansa组件
- 下载Eclipse