7.24 C++

news2024/9/23 3:18:40

封装Vector

#include <iostream>
#include <cstring>
using namespace std;

template <typename T>
class Vector
{
private:
    T *start;  //指向容器的起始地址
    T *last;   //指向容器存放数据的下一个位置
    T *end;    //指向容器的最后的下一个位置
public:
    Vector():start(new T),last(start),end(start){}         //无参构造
    Vector(T *s):start(new T(s)),last(start),end(start){}                            //有参构造
    Vector(const Vector<T> &other)                     //拷贝构造
    {
        start=new T[other.end-other.start];
        start=other.start;
        last=other.last;
        end=other.end;
    }
    Vector &operator=(Vector<T> other)                  //拷贝赋值
    {
        delete []start;
        this->start=other.start;
        for(int i=0;i<(other.end-other.start);i++)
        {
            start[i]=other.start[i];
        }
        return *this;
    }
    ~Vector()  //析构函数
    {
        delete start;
        start=nullptr;
        last=nullptr;
        end=nullptr;
    }

   //类内声明
    int Size();               //获取数据元素个数
    T &At(int index);         //根据下标获取数据
    bool Empty();             //判空
    bool Full();              //判满
    T &Front();               //获取第一个元素
    T &Back();                //获取最后一个元素
    void Clear();             //清空数据元素
    void Expand();            //二倍扩容
    void Push_back(T &elem);  //尾插
    void Pop_back();          //尾删
    void Output();            //循环遍历

};
//类外定义
//获取数据元素个数
template <typename T>
int Vector<T>::Size()
{
    return last-start;
}
//根据下标获取数据
template <typename T>
T &Vector<T>::At(int index)
{
    return *(start+index);
}
//判空
template <typename T>
bool Vector<T>::Empty()
{
    return start==last?true:false;
}
//判满
template <typename T>
bool Vector<T>::Full()
{
    return last==end?true:false;
}
//获取第一个元素
template <typename T>
T &Vector<T>::Front()
{
    return *start;
}
//获取最后一个元素
template <typename T>
T &Vector<T>::Back()
{
    return *(last-1);
}
//清空数据元素
template <typename T>
void Vector<T>::Clear()
{
    last=start;
}
//二倍扩容
template <typename T>
void Vector<T>::Expand()
{
    T *temp=new T[2*Size()];
    memcpy(temp,start,sizeof(T)*(end-start));
    delete []start;
    start=temp;
    last=start+Size();
    end=start+2*Size();
}
//尾插
template <typename T>
void Vector<T>::Push_back(T &elem)
{
    *(last++)=elem;
    if(last==end)
        Expand();
}
//尾删
template <typename T>
void Vector<T>::Pop_back()
{
    if(Empty())
        throw string("empty");
    last--;
}
//循环遍历
template <typename T>
void Vector<T>::Output()
{
    if(Empty())
        throw string("empty");
    for(int i=0;i<Size();i++)
    {
        cout<<*(start+i)<<" ";
    }
}
int main()
{
    Vector<int> v1;
    char ch;
    memset(&ch,0,sizeof (ch));
    int elem=0;

    do
    {
        //尾插
        cout<<"请输入尾插元素:"<<endl;
        cin>>elem;
        v1.Push_back(elem);
        cout<<"是否继续尾插?(Y/N)"<<endl;
        cin>>ch;
    }while(ch=='y'||ch=='Y');
    v1.Output();
    cout<<endl;

    //尾删
    try
    {
        //循环尾删
        do
        {
            v1.Pop_back();
            cout<<"是否继续出队?(Y/N)"<<endl;
            cin>>ch;
        }while(ch=='y'||ch=='Y');

    }
    catch (string e)
    {
        if(e=="empty")
            cout<<"容器为空!"<<endl;
    };
    cout<<endl;

    cout<<"数据元素个数为:"<<v1.Size()<<endl;
    cout<<"第一个元素为:"<<v1.Front()<<endl;
    cout<<"最后一个元素为:"<<v1.Back()<<endl;
    int index;
    cout<<"你要查看第几个元素:"<<" ";
    cin>>index;
    cout<<"这个值为:"<<v1.At(index-1)<<endl;


    return 0;
}

思维导图

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/799019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis-入门-快速入门程序

本次使用MyBatis框架是基于SpringBoot框架进行的&#xff0c;在IDEA中创建一个SpringBBot工程&#xff0c;根据自己的需求选择对应的依赖即可 快速入门 需求&#xff1a;使用MyBatis查询所有用户数据步骤&#xff1a; 准备工作&#xff08;创建Spring Boot工程、数据库user表…

【MATLAB】ILOSpsi制导率的代码解析

ILOSpsi制导率的代码解析 这里记录一下关于fossen的MMS工具箱中&#xff0c;关于ILOSpsi制导率的代码解析内容&#xff0c;结合fossen的marine carft hydrodynamics and motion control这本书来参考看 文章目录 ILOSpsi制导率的代码解析前言一、代码全文二、内容解析1.persist…

静态代理、jdk、cglib动态代理 搞不清? 看这个文章就懂了

一、代理模式 代理模式是一种比较好的理解的设计模式。简单来说就是 &#xff1a; 我们使用代理对象来增强目标对象(target obiect)&#xff0c;这样就可以在不修改原目标对象的前提下&#xff0c;提供额外的功能操作&#xff0c;扩展目标对象的功能。将核心业务代码和非核心…

linux下i2c调试神器i2c-tools安装及使用

i2c-tools介绍 在嵌入式linux开发中&#xff0c;有时候需要确认i2c硬件是否正常连接&#xff0c;设备是否正常工作&#xff0c;设备的地址是多少等等&#xff0c;这里我们就需要使用一个用于测试I2C总线的工具——i2c-tools。 i2c-tools是一个专门调试i2c的开源工具&#xff…

Linux查看内存的几种方法

PS的拼接方法 ps aux|head -1;ps aux|grep -v PID|sort -rn -k 4|head 进程的 status 比如说你要查看的进程pid是33123 cat /proc/33123/status VmRSS: 表示占用的物理内存 top PID&#xff1a;进程的ID USER&#xff1a;进程所有者 PR&#xff1a;进程的优先级别&#x…

503、415、403、404报错

1、503 报错 Service Unvailable 解决&#xff1a;如果你用的是网关gateway&#xff0c;观察下你的项目是否导入了nacos依赖。 2、415 报错 Unsupported Media Type post传对象的时候&#xff0c;这样就会报错 解决&#xff1a;axios传对象的时候&#xff0c;用这种就可以了。…

阿里内部都在疯传!企业级 Spring Boot 项目开发实战教程,先肝为敬

前言 本书结合大量的实际开发经验&#xff0c;由浅入深地讲解 Spring Boot 的技术原理和企业级应用开发涉及的的技术及其完整流程。无论是对 Java 企业级开发人员&#xff0c;还是 对其他相关技术爱好者&#xff0c;本书都极具参考价值。 本书特点 理论知识结合实践代码&#…

专项练习-04编程语言-03JAVA-05

1. 设有下面两个类的定义&#xff1a; class Person {} class Student extends Person { public int id; //学号 public int score; //总分 public String name; // 姓名 public int getScore(){return score;} } 类Person和类Student的关系是&#xff08;&#x…

vue2中开发时通过template中的div等标签自动输出对应的less形式带层级的class,只显示带class的

1.写完静态不是要写less吗&#xff0c;自动生成一下实现 this.getLevelClass(domId); domId是自定义的class名称&#xff0c;跟根据自己的需要设置 //vue2中开发时通过template中的div等标签自动输出对应的less形式带层级的class,只显示带class的getLevelClass(name) {let dom…

Python基础语法第七章之文件

目录 一、文件 1.1文件是什么 1.2文件路径 1.3文件操作 1.3.1 打开文件 1.3.2关闭文件 1.3.3写文件 1.3.4读文件 二、使用上下文管理器 2.1上下文管理器 一、文件 1.1文件是什么 变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失. 要想能让…

Excel 两列数据中相同的数据进行同行显示

一、要求 假设您有两个列&#xff0c;分别是A列和B列&#xff0c;需要在C列中找出A列对应的B列的值。 二、方案 方法1&#xff1a;寻常思路 凸显重复项对A列单独进行筛选–按颜色进行排序&#xff0c;然后升序对B列重复上述操作即可 方法2&#xff1a;两个公式 VLOOKUP 纵向查找…

【分享帖】LCD的MCU接口和SPI接口详解

LCD&#xff08;Liquid Crystal Display&#xff09;液晶屏&#xff0c;作为电子产品的重要组成部分&#xff0c;是终端用户与电子产品交互的重要载体。现在市场上的LCD&#xff0c;按照尺寸、功能、接口、用途等分为很多种&#xff0c;本文主要介绍如下两种LCD物理接口&#x…

tinymce插件tinymce-powerpaste-plugin——将word中内容(文字图片等)直接粘贴至tinymce编辑器中

TinyMCE是一款易用、且功能强大的所见即所得的富文本编辑器。同类程序有&#xff1a;UEditor、Kindeditor、Simditor、CKEditor、wangEditor、Suneditor、froala等等。 TinyMCE的优势&#xff1a; 开源可商用&#xff0c;基于LGPL2.1 插件丰富&#xff0c;自带插件基本涵盖日常…

Cesium态势标绘专题-直线箭头(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

网络安全大厂面试题

自我介绍 有没有挖过src&#xff1f; 平时web渗透怎么学的&#xff0c;有实战吗&#xff1f;有过成功发现漏洞的经历吗&#xff1f; 做web渗透时接触过哪些工具 xxe漏洞是什么&#xff1f;ssrf是什么&#xff1f; 打ctf的时候负责什么方向的题 为什么要搞信息安全&#xff0c;对…

照片加水印软件帮你搞定版权保护

嘿&#xff0c;亲爱的摄影爱好者&#xff01;是时候为你的照片保驾护航了&#xff01;想象一下&#xff0c;你在拍摄完一张美轮美奂的照片后&#xff0c;你为它加上个性化的水印&#xff0c;让每一个观者都知道这份艺术的创作者是你&#xff01;是不是觉得有点激动呢&#xff1…

幻方问题(Magic Squares)

目录 基本介绍 丢勒-幻方 高阶幻方矩阵 习题 1. 幻方检测 2. durerperm 3. 颜色分配表 4. 幻方矩阵的逆矩阵 5. 幻方矩阵的秩 基本介绍 nn幻方是含有1到n^2的整数数组&#xff0c;排列后是的每一行、每一列、正反两条主对角线上数字的和都是相同的。对于每个n>2都有…

Java类的默认构造函数

什么情况下存在默认构造函数 说明 如果一个Java类没有显式包含构造函数的声明&#xff0c;那么隐含着有一个默认构造函数。 示例 定义一个类B&#xff0c;没有显式声明构造函数&#xff0c;所以存在一个默认构造函数&#xff1a; package com.thb;public class B {public …

你说你会Java手动锁,但你会这道题吗???

按照这个格式输出你会吗&#xff1f;&#xff1f;&#xff1f; 你说你不会&#xff0c;接下来认真看认真学了。 1.首先引入原子类。AtomicInteger num new AtomicInteger(0); 什么是原子类&#xff1f; 就是可以保证线程安全的原子操作的数据类型。 有什么作用&#xff1f;…

Selenium结合Unittest

1、Unittest&#xff1a;单元测试框架 ——对软件中的最小可测单元进行检查和验证 作用&#xff1a; 提供用例组织及执行提供丰富的断言方法&#xff08;判断实际结果与预期结果是否一致&#xff09;提供丰富的日志及测试结果 2、Unittest核心要素 TestCase&#xff08;测…