35.自己实现vector模板库myvector
- 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(); }
35.自己实现vector模板库myvector的更多相关文章
- c++转载系列 std::vector模板库用法介绍
来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...
- 143.vector模板库
myvector.h #pragma once #include <initializer_list> #include <iostream> using namespace ...
- C++ 标准模板库(STL)——容器(Containers)的用法及理解
C++ 标准模板库(STL)中定义了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量(vector).队列(queue).栈(stack).set.map等.这次主要 ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++STL模板库序列容器之vector
目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. 三丶常用算法 1.常见算法中的算法方法. 2.sor ...
- C++标准模板库(STL)之Vector
在C中,有很多东西需要自己实现.C++提供了标准模板库(Standard Template Libray,STL),其中封装了很多容器,不需要费力去实现它们的细节而直接调用函数来实现功能. 具体容器链 ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- C++:标准模板库vector
一:介绍 vector是C++标准模板库,是一个容器,底层是数组,为连续内存. 命名空间为std,所属头文件为<vector> 注意:不是<vector.h> vector ...
- 标准模板库(STL)学习指南之sort排序
对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算法也基本固定下来,不需要你再去花费心思 ...
随机推荐
- NOIP2017提高组模拟赛 8(总结)
NOIP2017提高组模拟赛 8(总结) 第一题 路径 在二维坐标平面里有N个整数点,Bessie要访问这N个点.刚开始Bessie在点(0,0)处. 每一步,Bessie可以走到上.下.左.右四个点 ...
- 如何让Java写的程序,脱离Eclipse在别人的电脑上运行?
Java程序运行,离不开JRE. 将JRE文件夹拷贝出来, 将编写程序的bin文件夹拷贝出来, 再编写一个bat文件. start jre\bin\javaw.exe -cp .\bin\ -Djav ...
- hdoj--3592--World Exhibition(差分约束)
World Exhibition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- zzulioj--1777--和尚特烦恼3——何时能下山(水题)
1777: 和尚特烦恼3--何时能下山 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 203 Solved: 111 SubmitStatusWeb ...
- poj--3250--Bad Hair Day(模拟)
Bad Hair Day Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit ...
- Ubuntu16.04 Mysql
1.安装mysql root@ubuntu:~# sudo apt-get install mysql-server root@ubuntu:~# apt install mysql-client r ...
- MyBatis数据持久化(六)resultMap使用
resultMap是MyBatis最强大也是最重要的特性,使用它我们可以將查询结果或者sql输入条件和一个HashMap的key进行映射,大大简化了sql查询条件的输入,而且使得数据的查询变得非常灵活 ...
- 【原创】Apache集群报Service Temporarily Unavailable的解决
Apache的集群突然时不时的报出以下错误: Service Temporarily Unavailable The server is temporarily unable to service y ...
- STM8S103汇编文档和注意
1.官方文档<STM8 CPU programming manual>介绍了指令和寻址方式 2.辅助类文档,boot loader文档<STM8 bootloader> 3.关 ...
- 理解ZBrush中的笔触
笔触主要配合笔刷来使用,同样的笔刷搭配不同的笔触可以绘制出各种不同的效果.简言之,ZBrush 4R8就是提供了各种各样的笔触效果,例如,有模拟连贯笔触的效果,也有模拟喷枪喷洒的笔触效果. 下面简单认 ...