当前位置: 首页 > news >正文

动态数组写模板类

#include <iostream>
 
using namespace std;
template <typename T>//使用模板数据类型
class MYVCT
{
private:
    //动态数组定义三根指针分别指向首尾和使用量尾
    T* first;
    T* last;
    T* end;
public:
    MYVCT(int size=2){//有参构造赋值创造空间
        first=new T[size];//申请动态空间
        last =first;//首尾地址相同说明为空
        end=first+size;//空间尾指针
    }
    ~MYVCT(){//析构函数
        delete []first;
        first=last=end=nullptr;
    }
    MYVCT(const MYVCT &other)//拷贝构造
    {
        int len=other.last-other.first;
        int size=other.end-other.first;
        this->first=new T[size];//新对象的容量
        memcpy(this->first,other.first,len*sizeof (T));
    }
    //判空,为空返回turl,不为空返回false
    bool empty()
    {
        return this->first==this->last;
    }
    //判满,尾指针和空间尾指针重合时,为满
    bool full()
    {
        return this->last==this->end;
    }
    //扩容原则
    void greater()
    {
        //获取当前容器总容量
        int len=this->end-this->first;
        //定义一个新的指针对象申请2倍数据的动态堆空间
        T* temp=new T[len*2];
        //将之前的空间数据拷贝给给新的空间
        memcpy(temp,this->first,len*sizeof (T));
        //然后将之前空间给回收了
        delete []first;
        //再将当前指针指向当前
        this->first=temp;
        //更新其他指针
        last=first+len;
        end=first+2*len;
    }
 
    //尾插对象
    void tail_insert(const T m)
    {
        if(full())
        {
            greater();
        }
        *last=m;//last这一位属于有数据的下一位
        last++;
    }
    //实现尾删
    void pop_delete()
    {
        if(empty()==1)
        {
            cout<<"数据清空\n"<<endl;
            return;
        }
        --last;
    }
    //获取数组长度
    int my_size()
    {
        return end-first;
    }
    //获取使用的数组长度
    int my_len()
    {
        return last-first;
    }
    T& at(int dex)const
    {
 
        return *(first+dex);
    }
};
int main()
{
    MYVCT<int> v;
    for(int i=1; i<=20; i++)
    {
        v.tail_insert(i);
        cout<<v.my_size()<<endl;
    }
    for(int i=0; i<20; i++)
    {
        cout<<v.at(i)<<" ";
    }
    cout<<endl;
    cout << "Hello World!" << endl;
    return 0;
}

相关文章:

  • 代码错误与检查简短教程(新手适用)
  • Java Design Patterns 之API 网关模式
  • vue框架的基础语法之方法和事件的绑定,样式绑定,循环渲染,条件渲染
  • 项目第一天
  • go get 拉取报错The project you were looking for could not be found的解决方法
  • 算法题练习——NC15 求二叉树的层序遍历、NC88 寻找第K大
  • java基于springboot+vue的汉服推广与交流平台
  • 6面向对象中的继承
  • 【非正式协议 Objective-C语言】
  • Java面试题09-ThreadLocal的底层原理
  • Golang依赖管理(GOPATH->vendor->Go Module)
  • java计算机毕业设计网上报名及成绩查询系统源码+数据库+系统+lw文档+mybatis+运行部署
  • 机器学习泛化误差
  • 常见的几种填充方式:ZeroPad2d/ReflectionPad2d...(Pytorch)
  • 设备间同步的电子书阅读器--查找未果
  • 《深入 React 技术栈》
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • Angular数据绑定机制
  • CAP理论的例子讲解
  • crontab执行失败的多种原因
  • go语言学习初探(一)
  • java2019面试题北京
  • JS字符串转数字方法总结
  • Leetcode 27 Remove Element
  • Mybatis初体验
  • QQ浏览器x5内核的兼容性问题
  • Swift 中的尾递归和蹦床
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 排序(1):冒泡排序
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • - 转 Ext2.0 form使用实例
  • puppet连载22:define用法
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​ArcGIS Pro 如何批量删除字段
  • ​马来语翻译中文去哪比较好?
  • #define与typedef区别
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (06)金属布线——为半导体注入生命的连接
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (学习日记)2024.02.29:UCOSIII第二节
  • *p++,*(p++),*++p,(*p)++区别?
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET企业级应用架构设计系列之开场白
  • @SuppressWarnings注解
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [20150629]简单的加密连接.txt
  • [20161214]如何确定dbid.txt