DAY7,C++(封装标准模板库(STL)---Vectors容器模板)(已优化)

news2024/11/18 6:02:10

1.封装标准模板库(STL)---Vectors容器模板(已优化);

#include <iostream>

using namespace std;

template <typename T>
class Myvector
{
private:
    T *first;  //指向堆区空间容器的首地址
    T *last;  //指向容器最后一个元素的下一个位置
    T *end;  //指向容器的最大位置

public:
    //构造函数
    Myvector(int size = 3)
    {
        first = new T[size];
        last =first;  //说明容器空
        end = first + size;
    }
    //析构函数
    ~Myvector()
    {
        delete [] first;
        first = nullptr;
        last = nullptr;
        end = nullptr;
    }

    //拷贝构造
    Myvector(const Myvector<T> &other)
    {
        int size = other.size();  //当前长度
        int max_size = other.max_size(); // 当前最大容量
        first = new T[max_size];

        memcpy(first,other.first,sizeof (T)*size);
        last = first + size;
        end = first + max_size;
    }

    //拷贝赋值
    Myvector &operator =(const Myvector<T> &other)
    {
        if(this != &other)
        {
            delete [] first;
            int size = other.size();
            int max_size = other.max_size();
            first = new T[max_size];   //新空间大小

            memcpy(first,other.first,sizeof (T)*size);
            last = first + size;
            end = first + max_size;
        }
        return *this;
    }

    //empty() 判空
    bool empty()
    {
        return last==first;
    }

    //full() 判满
    bool full()
    {
        return last==end;
    }

    //clear() 清空元素
    void clear()
    {
        last=first;
    }

    //size() 当前vector中元素的长度
    int size() const
    {
        return last-first;
    }

    //max_size() 当前vector的最大容量
    int max_size() const
    {
        return end-first;
    }


    //push_back() 尾插元素
    void push_back(const T elem)
    {
        if(full() == true)
        {
            cout<<"容器已满,2倍扩容后继续插入>>> "<<endl;
            expand();
        }
        *last = elem;
        last++;
    }

    //pop_back() 尾删元素
    void pop_back()
    {
        if(empty() == true)
            return;
        last--;
    }

    //T &at(int index) 查询元素
    T &at(int index)
    {
        if(index<0 || index>=size())
            throw string("访问越界!");  //异常处理
        return first[index];
    }

    //front() 返回首元素的引用
    T &front()
    {
        if(!empty())
            return *first;
        throw string("myvector空");
    }

    //back() 返回尾元素的引用
    T &back()
    {
        if(!empty())
            return *(last-1);
        throw string("myvector空");
    }

    //expand() 二倍扩容
    void expand()
    {
        int Msize = end - first;
        T *temp = new T[2*Msize];  //堆区申请一个2倍容器最大容量的空间
        memcpy(temp,first,sizeof(T)*Msize); //更新数据
        delete [] first;  //释放原空间
        first = temp;  //更新first指向

        last = first + Msize; //更新其他指针
        end = first + 2*Msize;
    }
    //遍历
    void Output()
    {
        for(int i=0; i<size(); i++)
        {
            cout<<first[i]<<" ";
        }
        cout<<endl;
    }

};

int main()
{
    Myvector<int> v1;

    if(v1.empty())          //判空
        cout<<"v1空"<<endl;
    else
        cout<<"v1不空"<<endl;

    for(int i=0; i<6; i++)  //尾插
    {
        int elem;
        cout<<"输入要插入的元素>>> ";
        cin>>elem;
        v1.push_back(elem);
    }
    v1.Output();       //遍历

    cout<<"v1.size= "<<v1.size()<<endl;

    v1.pop_back();      //尾删
    cout<<"尾删一个元素后>>> ";
    v1.Output();       //遍历

    cout<<"第一个元素>>> "<<v1.front()<<endl;  //首尾元素
    cout<<"最后一个元素>>> "<<v1.back()<<endl;

    cout<<"v1.at(0)>>> "<<v1.at(0)<<endl;  //查找元素
    cout<<"v1.at(1)>>> "<<v1.at(1)<<endl;
    cout<<endl;

    Myvector<int> v2(v1);    //拷贝构造
    cout<<"拷贝构造v2>>> ";
    v2.Output();

    Myvector<int> v3;    //拷贝赋值
    v3 = v1;
    cout<<"拷贝赋值v3>>> ";
    v3.Output();

    v1.clear();         //清空
    v2.clear();
    v3.clear();
    cout<<"v1v2v3清空后>>> ";
    v1.Output();       //遍历
    v2.Output();
    v3.Output();

    return 0;
}

 

2.今日思维导图;

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

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

相关文章

编译/反编译

1.Android APK 1.软件 1.apktool 1.作用&#xff1a;反编译apk或重新打包apk 2.dex2jar 1.作用&#xff1a;将Android的可执行文件.dex转换为.jar 3.jd-gui 1.作用&#xff1a;方便阅读jar文件的代码工具 2.步骤 1.通过apktool将apk软件反编译2.使用dex2jar将classes.dex文件转…

算法的时间复杂度、空间复杂度如何比较?

目录 一、时间复杂度BigO 大O的渐进表示法&#xff1a; 例题一&#xff1a; 例题2&#xff1a; 例题3&#xff1a;冒泡排序的时间复杂度 例题4&#xff1a;二分查找的时间复杂度 书写对数的讲究&#xff1a; 例题5&#xff1a; 实例6&#xff1a; 利用时间复杂度解决编…

filter(过滤器)

目录 一、过滤器应用场景 二、Filter&#xff1a;过滤器 1. 快速入门 2. 过滤器执行流程 3. 过滤器生命周期方法 4. 过滤器配置详解 5. 过滤器链(配置多个过滤器) 三、监听器 一、过滤器应用场景 过滤器是处于客户端与服务器资源文件之间的一道过滤网&#xff0c;在访问…

基于Python机器学习、深度学习在气象、海洋、水文等技能提升教程

详情点击链接&#xff1a;基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用 前言 Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。…

经营简报及考核360表格

文章目录 经营简报效果图代码tableObjectSpanMethod.js 考核360委员会效果图 经营简报效果图不需要合并单元格且有汇总表头的 懒得封装了&#xff0c;所以整体没有封装 经营简报 效果图 代码 <template><el-tableref"tableRef":data"tableData.lengt…

基础实验篇 | CopterSim中回传提示消息实验

基础实验篇|CopterSim中回传提示消息实验 01实验名称及目的 回传提示消息实验&#xff1a;在飞控中&#xff0c;我们时常需要向外发布一些文字消息&#xff0c;来反映系统当前的运行状态&#xff0c;这个功能可以通过发送“mavlink_log”的uORB消息来实现。 02实验效果 在Cop…

如何让 ChatGPT 更懂你?新功能 Custom Instructions 尝试

对比 我们先来做一个对比实验。这里咱们让 ChatGPT 执行一个很简单的任务 —— 介绍一下 AI 生成内容&#xff08;AIGC&#xff09;。为了能够让 ChatGPT 查询资料&#xff0c;咱们给它提供了 Web Pilot 插件。但是 ChatGPT 并没有主动调用插件&#xff0c;而是直接给出了解释。…

Cisco IOS操作(红茶三杯CCNA)

Cisco IOS模式 &#xff1a;用户模式 #&#xff1a;特权模式(config)#&#xff1a;全局配置模式 接口模式&#xff1a;(config-if)#线路模式&#xff1a;(config-line)#路由配置模式&#xff1a;(config-router)# 使用CLI的帮助 - 命令提示及补全:?、Tab、命令关键字&…

【微信支付】Java微信支付流程

微信支付 微信支付流程 当我们需要支付一件商品时&#xff0c;首先从前端像后端传来商品ID&#xff0c;后端根据商品ID查询商品信息&#xff0c;然后封装订单信息&#xff0c;保存订单。下一步就是向微信远程调用支付接口&#xff0c;微信返回code_url&#xff0c;后端封装co…

vscode恢复被误删的文件(巧用本地历史记录)

背景&#xff1a;&#xff08;希望永远不要有这个背景&#xff09;使用vscode开发项目时&#xff0c;新建了文件&#xff0c;且文件没有git add、没有git stash、没有git commit。但是不小心点中了撤销更改&#xff08;新文件的撤销更改&#xff0c;其实就是删除该新文件&#…

【教学类-34-06】20230726拼图(“三角”凹凸拼图)3*4格子(中班主题《个别化拼图》偏美术)

图片展示&#xff1a; 圆形凹凸角变成三角形凹凸角&#xff0c;便于幼儿剪直线。 背景需求&#xff1a; 5月底&#xff0c;我自制凹凸角拼图&#xff08;动画片图片转拼图&#xff09;给幼儿裁剪&#xff0c;拼贴 教学实际操作时&#xff0c;发现圆形的凸角不适合幼儿裁剪&…

ROS 2 — 托管(生命周期)节点简介

一、说明 这篇文章是关于理解ROS 2中托管&#xff08;生命周期&#xff09;节点的概念。我们描述了概念性的想法以及我们为什么需要它。所以让我们开始吧&#xff01; 二、托管式节点 — 什么和为什么&#xff1f; 为了理解托管式节点&#xff0c;让我们从一个简单的问题陈述开…

微服务——服务异步通讯RabbitMQ

前置文章 消息队列——RabbitMQ基本概念容器化部署和简单工作模式程序_北岭山脚鼠鼠的博客-CSDN博客 消息队列——rabbitmq的不同工作模式_北岭山脚鼠鼠的博客-CSDN博客 消息队列——spring和springboot整合rabbitmq_北岭山脚鼠鼠的博客-CSDN博客 目录 Work queues 工作队列…

数据结构(c++实现)

数据结构 目录 数据结构1.链表实现单链表双链表 2.栈(先进后出&#xff0c;后进先出)3.单调栈4.队列&#xff08;先进先出&#xff09;5.单调队列6.小根堆操作 7.KMP8.Trie树(字典树) 1.链表实现 单链表 #include <iostream>using namespace std;const int N 100010;/…

AcWing 3708. 求矩阵的鞍点

输入样例&#xff1a; 3 4 1 2 3 4 1 2 3 4 1 2 3 4输出样例&#xff1a; 1 4 4 2 4 4 3 4 4 #include<bits/stdc.h> using namespace std; const int N1010; int n,m,a[N][N],x[N],y[N],flag1; int main(){scanf("%d%d",&n,&m);for(int i1;i<n;i…

抖音西瓜实时作品监控,一秒更新提醒

抖音西瓜实时作品监控&#xff0c;一秒更新提醒 安装必要的依赖库&#xff1a;使用pip安装aweme库。 pip install aweme 导入所需的库。 import datetime import time import schedule from aweme import API 创建一个函数&#xff0c;用于检查抖音作品是否更新。 def check_u…

端到端的视频编码方法及码率控制算法

文章目录 基于卷积神经网络的的端到端的视频编码方法自编码器 基于端到端学习的图像编码研究及进展变换量化熵编码 面向视频会议场景的 H.266/VVC 码率控制算法研究基于强化学习的视频码率自适应决策研究自适应流媒体传输技术码率自适应算法研究现状强化学习深度强化学习算法介…

mp4视频太大怎么压缩?教你轻松减小视频大小

MP4视频太大怎么办&#xff1f;很多人都会遇到这样的问题&#xff0c;MP4视频往因为画面清晰度高&#xff0c;画面流畅&#xff0c;所以视频文件会比较大&#xff0c;如果你想向朋友或者家人分享这个视频&#xff0c;但是又因为文件太大无法发送&#xff0c;那么怎么办呢&#…

可视化开发工具:让软件应用开发变得更轻松

一、前言 你是否为编程世界的各种挑战感到头痛&#xff1f;想要以更高效、简单的方式开发出专业级的项目&#xff1f; JNPF低代码工具正是你苦心寻找的产品&#xff01;它是一款专为稍微懂一点点编程思想的入门级人员设计的神奇工具&#xff0c;集成了丰富的功能和组件&#xf…

使用 CSS 自定义属性

我们常见的网站日夜间模式的变化&#xff0c;其实用到了 css 自定义属性。 CSS 自定义属性&#xff08;也称为 CSS 变量&#xff09;是一种在 CSS 中预定义和使用的变量。它们提供了一种简洁和灵活的方式来通过多个 CSS 规则共享相同的值&#xff0c;使得样式更易于维护和修改。…