C++QT day7

news2025/7/10 18:27:30

仿照vector手动实现自己的myVector,最主要实现二倍扩容功能

#include <iostream>

using namespace std;

template<typename T>
class my_vector
{

    int size;//可存储的容量大小
    int num;//当前存储的元素个数
    T* data;//存储数据的空间地址

public:
    //无参构造函数
    my_vector();
    //有参构造函数
    my_vector(int n, const T m);
    //析构函数
    ~my_vector();
    //拷贝构造
    my_vector(const my_vector &other);
    //返回当前的容器大小
    int get_capacity();
    //获取容器中的元素个数
    int get_size();
    //判空函数
    bool empty();
    //添加函数
    void push_back(const T &val);
    //向容器中赋值
    void assign(int n,const T &val);
    //访问容器中的元素
    T& at(int loc);
    //清空容器中的元素
    void clear();
    //删除最后一个元素
    void pop_back();
    //返回起始位置的引用
    T& front();
    //返回最后一个位置的引用
    T& back();
    //返回第一个位置的迭代器
    T* begin();
    //返回末尾下一个位置的迭代器
    T* end();
    //任意插入
    T* insert(T* p, const T& n);
    //遍历
    void show();
};
int main()
{

   my_vector<int> s1;
   s1.assign(7,1);
   cout<<"最大容量"<<s1.get_capacity()<<endl;
   cout<<"最后一个元素 "<<s1.at(6)<<endl;
   s1.insert(s1.end(),4);
   cout<<"最后一个元素 "<<s1.back()<<endl;
   cout<<"共有元素"<<s1.get_size()<<endl;
   cout<<"最后一个元素 "<<s1.at(8)<<endl;
   s1.show();
   cout<<"最大容量"<<s1.get_capacity()<<endl;
   s1.pop_back();
   s1.show();
    return 0;
}

//无参构造
template<typename T>
my_vector<T>::my_vector()
{
    size=6;
    num=0;
    data = new T[6];
}

//有参构造
template<typename T>
my_vector<T>::my_vector(int n, const T m)
{
    size = n;
    num = n;
    data = new T[n];
    for(int i=0;i<n;i++)
    {
        data[i]= m;
    }
}

template<typename T>
my_vector<T>::~my_vector()
{
    delete []data;
}

//拷贝构造
template<typename T>
my_vector<T>::my_vector(const my_vector &other)
{
    size = other.size;
    num  = other.num;
    data = new T[size];

    for(int i=0;i<other.num;i++)
    {
        data[i] = other.data[i];
    }
}

//当前容器的大小
template<typename T>
int my_vector<T>::get_capacity()
{
    return size;
}

template<typename T>
int my_vector<T>::get_size()
{
    return num;
}

//判空函数
template<typename T>
bool my_vector<T>::empty()
{
    if(0 == num)
    {
        return true;
    }
    else
        return false;
}

//添加函数
template<typename T>
void my_vector<T>::push_back(const T &val)
{
    if(num<size)
    {
        data[num] = val;
        num++;
    }
    else
    {

        T *temp = new T[2*size];
        size = 2*size;
        for(int i=0;i<num;i++)
        {
            temp[i] = data[i];
        }
        delete []data;//释放旧的空间
        data = temp;//指向新的空间
        temp = nullptr;
        data[num] = val;
        num++;

    }
}

//向容器中赋值
template<typename T>
void my_vector<T>::assign(int n, const T &val)
{
    //判断赋值的个数是否超过最大容量
    if(n>size)
    {

        delete [] data;
        data = nullptr;
        data = new  T [n];
        size = n;
        num = n;
        //赋值
        for(int i=0;i<n;i++)
        {
            data[i] = val;
        }
    }
    else
    {
        num=n;
        for(int i=0;i<n;i++)
        {
            data[i] = val;
        }
    }
}

//访问元素
template<typename T>
T& my_vector<T>::at(int loc)
{
    if(loc > num || loc < 0)
    {
        throw T(1);//越界异常
    }
    else
    {
        return data[loc-1];
    }
}

//清空所有元素
template<typename T>
void my_vector<T>::clear()
{
    while (!empty())
    {
        pop_back();
    }

}

//删除末尾元素
template<typename T>
void my_vector<T>::pop_back()
{
    if(!empty())
    {
        data[num-1] = 0;
         num--;
    }
    else
        return ;
}

//返回第一个位置的引用
template<typename T>
T &my_vector<T>::front()
{
    return data[0];
}

//返回最后一个位置的引用
template<typename T>
T &my_vector<T>::back()
{
    return data[num-1];
}

//返回第一个位置的迭代器
template<typename T>
T *my_vector<T>::begin()
{
    return &data[0];
}

//返回末尾下一个位置的迭代器
template<typename T>
T *my_vector<T>::end()
{
    return &data[num];
}

//任意插入
template<typename T>
T *my_vector<T>::insert(T *p, const T &n)
{
    int j = 0;
      while(&data[0]+j != p) //寻找输入的是第几个数据的地址
      {
          j++;
      }
      if(num == size) //判断当前是否已满
      {
          int i = 0;
          T* data_new = new T[size*2];  //二倍扩容
          size = size * 2;
          while(i < num)       //将旧区的数据内容赋给新区
          {
              data_new[i] = data[i];
              i++;
          }
          delete []data;          //释放旧区
          data = data_new;        //指向新区
          data_new = nullptr;     //新指针置空
          //将指定位置之后的数据全都后移一位
          for(int k = num,i = j;i < num;i++,k--)
          {
                  data[k] = data[k-1];
          }
          data[j] = n;     //插入元素
          num++;               //存储数量加1
          return &data[j];
      }
      else if(num < size)
      {
          //将指定位置之后的数据全都后移一位
          for(int k = num,i = j;i < num;i++,k--)
          {
                  data[k] = data[k-1];
          }
          data[j] = n;     //插入元素
          num++;               //存储数量加1
          return &data[j];
      }
}

//遍历
template<typename T>
void my_vector<T>::show()
{
    int i = 0;
    for(;i < num;i++)
    {
        cout << data[i] << "\t";
    }
       cout << endl;
}




思维导图:

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

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

相关文章

C++下基于粒子群算法解决TSP问题

粒子群优化算法求解TSP旅行商问题C&#xff08;2020.11.12&#xff09;_jing_zhong的博客-CSDN博客 混合粒子群算法&#xff08;PSO&#xff09;&#xff1a;C实现TSP问题 - 知乎 (zhihu.com) 一、原理 又是一个猜答案的算法&#xff0c;和遗传算法比较像&#xff0c;也是设…

小米手机安装面具教程(Xiaomi手机获取root权限)

文章目录 1.Magisk中文网&#xff1a;2.某呼&#xff1a;3.最后一步打开cmd命令行输入的时候:4.Flash Boot 通包-Magisk&#xff08;Flash Boot通刷包&#xff09;5.小米Rom下载&#xff08;官方刷机包&#xff09;6.Magisk最新版本国内源下载 1.Magisk中文网&#xff1a; htt…

深入解析 Nginx 代理配置:从 server 块到上游服务器的全面指南

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

XSS跨站脚本攻击

XSS全称&#xff08;Cross Site Scripting&#xff09;跨站脚本攻击,XSS属于客户端攻击&#xff0c;受害者最终是用户&#xff0c;在网页中嵌入客户端恶意脚本代码&#xff0c;最常用javascript语言。&#xff08;注意&#xff1a;叠成样式表CSS已经被占用所以叫XSS&#xff09…

(vue2).sync修饰符、ref和$refs、$nextTick、自定义指令、插槽

.sync修饰符 实现子组件和父组件数据的双向绑定 &#xff0c;简化代码 prop属性名&#xff0c;可以自定义&#xff0c;非固定value 本质&#xff1a;属性名和update&#xff1a;属性名的合写 <BaseDialog :value"isShow" update"isShow$event"> /…

朋友圈大佬都去读研了,这份备考书单我码住了(文末赠书)

朋友圈大佬都去读研了&#xff0c;这份备考书单我码住了 1、《数据结构与算法分析》2、《计算机网络&#xff1a;自顶向下方法》3、《现代操作系统》4、《深入理解计算机系统》5、《概率论基础教程&#xff08;原书第10版》6、《线性代数&#xff08;原书第10版&#xff09;》7…

猫爪插件-官网下载方法

一、猫抓 github 二、下载 三、安装 谷歌浏览器&#xff0c;打开插件页面&#xff0c;打开开发者模式&#xff0c;将插件拖入浏览器安装。

数学实验-素数(Mathematica实现)

一、实验名称&#xff1a;素数 二、实验环境&#xff1a;Mathematica 10.3软件 三、实验目的&#xff1a;本实验将探讨素数的规律&#xff0c;研究素数的判别、最大的素数、构成生成素数的公式和素数的分布&#xff0c;并学会求解某些范围内的素数。 四、实验内容、步骤以及…

Maven仓库Nexus安装部署

Nexus是半开源软件&#xff0c;用于支持Apache Maven的在线仓库&#xff0c;Maven在CI/CD领域中&#xff0c;支持Java工程编译、打包、发布&#xff0c;而Maven发布的目的地是Nexus中央仓库。Nexus也提供商业版本&#xff0c;商业版本支持高可用、企业级统一认证与登录以及其他…

MobaXterm工具软件使用介绍

大家好&#xff0c;我是虎哥&#xff0c;最近由于大部分嵌入式的系统都切换到了ubuntu20.04及更高版本的系统&#xff0c;导致我自己使用的Xshell也需要从5升级到7&#xff0c;但是Xshell7尽然开始收费了&#xff0c;网上也没有什么好用的破解版本&#xff0c;索性我就准备找个…

2023年浦东新区数字化安全风险智慧管控技能比武初赛-技能题一

目录 二、技能题 2.1 MD5===MD5 三、业*&&&务**&&联&&&*&&系 二、技能题 2.1 MD5===MD5

react | react-router-dom v6 结合 antd 面包屑 |嵌套路由

大致需求图示如上&#xff1a; 需求&#xff1a; 1. 点击page2默认进入/page2/中国 2. 在中国界面选择省份&#xff0c;进入浙江省 3. 在浙江省中选择市&#xff0c;进入杭州市 4. 选择大学&#xff0c;进入浙江大学 5. 点击面包屑中某个tab&#xff0c;进入对应tab界面&…

【Redis 多机服务的简单认识】

目录 主从同步 哨兵模式 集群服务 随着业务的不断发展&#xff0c;单机 Redis 的性能已经不能满⾜我们的需求了&#xff0c;此时我们需要将单机 Redis 扩展为多机服务&#xff0c;Redis 多机服务主要包含以下 3 个内容&#xff1a; Redis 主从同步Redis 哨兵模式Redis 集群…

【记录】Truenas scale|Truenas 的 SSH 服务连不上 VScode,终端能连上

一般 Truenas连不上 就只有两种情况&#xff1a; 第一种&#xff1a;用户没对应用户目录。需要去用户管理里面对每个用户设置目录。 第二种情况&#xff0c;服务有个选项没勾选。这时会发现能输入密码但是一点反应都没有&#xff0c;打开details会看到报错channel 3: open fai…

A股风格因子看板 (2023.09 第03期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第03期&#xff0c;指数组合数据截止日2023-08-31&#xff0c;要点如下 近1年A股风格因子检验统…

qml怎么显示网页

QML显示网页需要使用Qt WebEngine模块,它提供了一个WebEngineView组件,可以用来在QML中显示和交互网页。 首先,确保你已经安装了Qt WebEngine模块。如果你使用的是Qt的在线安装程序,你可以通过Qt Maintenance Tool来添加这个模块。 以下是如何在QML中使用WebEngineView来…

三维重建_表面重建_基于符号距离场的表面重建

目录 1. 三维物体的表面表达方式 1.1 边界表示法 (Boundary Representation) 1.2 空间划分法 (Spatial-Partitioning Representations) 1.3 构造体素法 (Boundary Constructive Solid Geometry) 2. 三维模型的表述方式 3. 基于符号距离场的表面重建方法 3.1 符号距离…

再不跳槽,就真晚了......

从时间节点上来看&#xff0c;9月、10月是每年跳槽的黄金季&#xff01; 以 BAT 为代表的互联网大厂&#xff0c;无论是薪资待遇、还是平台和福利&#xff0c;都一直是求职者眼中的香饽饽&#xff0c;“大厂经历” 在国内就业环境中无异于一块金子招牌。在这金三银四的时间里&…

吃瓜教程第一二章学习记录

当大多数人听到 "机器学习 "时&#xff0c;他们会联想到机器人&#xff1a;一个可靠的管家或一个致命的终结者&#xff0c;这取决于你问谁。但是&#xff0c;机器学习并不只是未来主义的幻想&#xff0c;它已经存在了。事实上&#xff0c;在一些特殊的应用中&#xf…

Redis:分布式锁误删原因分析

一、线程阻塞 例如&#xff0c;线程一获取分布式锁&#xff0c;但是线程一阻塞时间过长&#xff0c;导致锁超时释放。此时线程二获取分布式锁。当线程一阻塞结束后&#xff0c;释放分布式锁&#xff0c;但是释放的却是线程二的锁。此时线程二就不安全了&#xff0c;线程三也可…