C++ : 仿照Vector 手动实现自己的 MyVectory

news2024/7/6 19:19:57

1. 源代码

#include <iostream>
 
using namespace std;
 
template <typename T>
class myVector {
private:
    T* data;
    int size;
    int capacity;
public:
    // 构造函数
    myVector() : data(nullptr), size(0), capacity(0) {}
    //拷贝构造函数
    myVector(const myVector& other):size(other.size), capacity(other.capacity){
        data = new T[other.capacity];
        for (int i = 0; i < size; i++) {
            data[i] = other.data[i];
        }
    }
    // 拷贝赋值函数
    myVector& operator=(const myVector& other) {
        if (this != &other) {
            // 释放旧内存
            delete[] data;
 
            // 复制大小和容量
            this->size = other.size;
            this->capacity = other.capacity;
 
            // 为新对象分配内存
            data = new T[capacity];
 
            // 复制元素到新对象
            for (int i = 0; i < size; i++) {
                data[i] = other.data[i];
            }
        }
        return *this;
    }
    // 析构函数
    ~myVector() {
        delete[] data;
    }
    // 末尾添加元素
    void push_back(const T& element) {
        if (size == capacity) { // 容量不足时,分配更多空间
            if (capacity == 0) {
                capacity = 1;
            } else {
                capacity *= 2;
            }
            //重新创建一个空间
            T* newData = new T[capacity];
            // 复制元素到新空间
            for (int i = 0; i < size; ++i) {
                newData[i] = data[i];
            }
            delete[] data;
            data = newData;
        }
        data[size++] = element;
    }
    //末尾删除元素
    void pop_back(){
        if(empty())
        {
            throw string("is empty");
        }
        size--;
    }
    //判断Vector是否为空
    bool empty(){
        return size==0;
    }
    // 获取元素数量
    int getSize_() const {
        return size;
    }
    // 获取容器容量
    int getCapacity_() const {
        return capacity;
    }
    // 访问元素
    T& operator[](int index) {
        if (index < size) {
            return data[index];
        } else {
            throw string("Index out of range");
        }
    }
    // 迭代器
    class iterator {
    private:
        T* ptr;
    public:
        //构造函数
        iterator(T* p) : ptr(p) {}
        //*运算符重载
        T& operator*() {
            return *ptr;
        }
        //++it运算符重载
        iterator& operator++() {
            ++ptr;
            return *this;
        }
        //it++运算符重载
        iterator operator++(int) {
            iterator temp = *this;
            ++ptr;
            return temp;
        }
        //!=运算符重载
        bool operator!=(const iterator& other) const {
            return ptr != other.ptr;
        }
    };
 
    iterator begin() {
        return iterator(data);
    }
 
    iterator end() {
        return iterator(data + size);
    }
};
 
int main() {
    myVector<int> v1; //无参构造
 
    for (int i=0; i<10; i++) { //添加元素
        v1.push_back(i);
    }
 
    myVector<int>::iterator it1 = v1.begin(); //v1迭代器
    cout<<"v1>>";
    for (; it1 != v1.end(); it1++) { //show元素
        cout << *it1 << " ";
    }
    cout<<endl;
 
    myVector<int> v2 = v1;  //拷贝构造
    myVector<int>::iterator it2 = v2.begin(); //v2迭代器
    cout<<"v2>>";
    for (; it2 != v2.end(); it2++) { //show元素
        cout << *it2 << " ";
    }
    cout<<endl;
 
    myVector<int> v3;  //无参构造
    v3 = v1;  //拷贝赋值
    cout<<"is empty? = "<<v3.empty()<<endl;
    v3.pop_back(); // 队尾删除元素
    cout<<"size = "<<v3.getSize_()<<endl;
    cout<<"capacity = "<<v3.getCapacity_()<<endl;
    myVector<int>::iterator it3 = v3.begin(); //v3迭代器
    cout<<"v3>>";
    for (; it3 != v3.end(); it3++) { //show元素
        cout << *it3 << " ";
    }
    cout<<endl;
 
    return 0;

}

2. 思维导图

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

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

相关文章

【LeetCode每日一题】——面试题10.11.峰与谷

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 排序 二【题目难度】 中等 三【题目编号】 面试题10.11.峰与谷 四【题目描述】 在一个整数…

Vue学习笔记总结

目录 1、Vue核心 1.1什么是vue? 1.2什么是mvvm? ​编辑 1.3插值表达式{{}} 2.Vue中的常用指令 2.1内容渲染指令 2.2条件渲染指令 2.3事件绑定指令 2.4属性绑定指令 2.5列表渲染指令 2.5.1小案例-小黑的书架 2.6v-for中的key 2.7双向绑定指令 3.指令修饰符 3.1什…

前端JavaScript修饰器:简化代码,增强功能

​ &#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 引言 1. 修饰器简介 2. 修饰器语法 3. 类修饰器 应用场景 示例代码 4. 方法修饰器 应用场景 示例代码 5. 属性…

如何隐藏Selenium特征实现自动化网页采集

Selenium是一个流行的自动化网页测试工具&#xff0c;可以通过模拟用户在Chrome浏览器中的操作来完成网站的测试。然而&#xff0c;有些网站会检测浏览器是否由Selenium驱动&#xff0c;如果是&#xff0c;就会返回错误的结果或拒绝访问。为了避免这种情况&#xff0c;我们需要…

文件夹怎么保护?文件夹保护的方法有哪些?

文件夹是存储文件的功&#xff0c; 而保护文件夹可以有效地避免数据泄露&#xff0c;那么文件夹该怎么保护呢&#xff1f;下面我们就来了解一下吧。 文件夹保护3000 保护文件夹的方法除了加密之外&#xff0c;还有隐藏和伪装&#xff0c;而这些都可以通过文件夹保护3000来实现…

嵌入式学习笔记(33)S5PV210的第二阶段处理过程

&#xff08;1&#xff09;第一个过程&#xff0c;怎么找到具体是哪个中断&#xff1a;S5PV210中因为支持的中断源很多&#xff0c;所以直接设计了4个中断寄存器&#xff0c;每个32位&#xff0c;每位对应一个中断源。&#xff08;理论上210最多可以支持128个中断源&#xff0c…

打造生产级Llama大模型服务

对于任何想要尝试人工智能或本地LLM&#xff0c;又不想因为意外的云账单或 API 费用而感到震惊的人&#xff0c;我可以告诉你我自己的旅程是如何的&#xff0c;以及如何开始使用廉价的消费级硬件执行Llama2 推理 。 这个项目一直在以非常活跃的速度发展&#xff0c;这使得它非…

视频号挂公众号链接最新方法教程,非常给力,使用的朋友不亦乐乎

接着看看视频号挂链接发展的来龙去脉 要点一&#xff1a;早在前两年&#xff0c;视频号链接直接显示在视频上方&#xff0c;可直接点击&#xff0c;哇塞&#xff0c;做视频号的福音&#xff0c;怎么能这么给力呢&#xff0c;引流不是特别方便吗&#xff0c;好景不长&#xff0c…

目前广州股票开户交易佣金费率最低是多少?怎么申请低佣金账户?

股票开户是指投资者在证券公司或券商处申请开立证券账户&#xff0c;并获得购买和交易股票的资格。一般需要提供身份证明、个人信息、资产证明等材料&#xff0c;并签署相关协议和风险提示书。开户后&#xff0c;投资者可以通过证券账户进行股票买卖等交易活动。 目前广州股票…

Vue奶茶冷饮店在线点单系统管理系统 微信小程序

奶茶店管理系统采用了java语言&#xff0c;开发了功能完备、使用简单的前端应用程序&#xff0c;并建立、维护了一个数据完整、安全、稳定性强的后台数据库系统。 系统使用java语言和Mysql数据库作为设计工具&#xff0c;可简单易行地学习操作。用户角色之间的相结合开发一套奶…

微服务全栈:深入核心组件与开发技巧

文章目录 1.服务注册与发现1.1. 客户端注册 (ZooKeeper)1.2. 第三方注册 (独立的服务Registrar)1.3. 客户端发现1.4. 服务端发现1.5. Consul1.6. Eureka1.7. SmartStack1.8. Etcd 2. API 网关2.1. 请求转发2.2. 响应合并2.3. 协议转换2.4. 数据转换2.5. 安全认证 3. 配置中心3.…

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

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

点亮你的证件照!自制背景颜色修改脚本揭秘!

文章目录 &#x1f31d;前言&#x1f31a;重要的工具 - removebg&#x1f311;removebg介绍&#x1f312;拿到API KEY &#x1f31a;脚本的使用教程&#x1f4da;资源 专栏Python零基础入门篇&#x1f525;Python网络蜘蛛&#x1f525;Python数据分析Django基础入门宝典&#x…

【UnityShaderLab实现“Billboard“始终面向相机_播放序列图的效果_案例分享(内附源码)】

"Billboard"始终面向相机 Shader "billboard" {Properties{_MainTex ("Main Tex", 2D) = "white" {}_Color (

GUN、MIT、Apache、BSD、MPL各种开源协议介绍和区别

文章目录 目前主流的开源协议GNU通用公共许可证&#xff08;GNU General Public License&#xff0c;GPL&#xff09;MIT许可证Apache许可证BSD许可证MPL Mozilla公共许可证&#xff08;Mozilla Public License&#xff0c;MPL&#xff09; 各种主流开源协议的区别GNU通用公共许…

IP地址的表示方式与分类

一、IP地址简介 IP地址是互联网的协议地址&#xff0c;为互联网的每一个网络和每一台主机分配一个逻辑地址。IP协议是为了计算机互相连接进行通信而设计的协议。 二、IP地址的表示方式 IP地址是一个32位的二进制数&#xff0c;通常被分割为4个“8位二进制数”(也就相当于四个…

数学建模| 快速入门(以华为杯2019F题为例)

数学建模快速入门&#xff08;华为杯2019F题为例&#xff09; 参考论文华为杯2019F题第一问为例读题——筛选出有用的信息问题分析——搞清楚目标和要求建立模型——将实际问题转化为数学问题判断题目类型模型假设数据处理航迹规划模型建立 模型求解——实际求解的细节结果分析…

JAVA黑马程序员day12--集合进阶(下部--双列集合)

Map HashMap 练习一 需提前定义学生类&#xff0c;并重写HashMap方法&#xff08;不然无法覆盖&#xff09; public class MapDemo4 {public static void main(String[] args) {//1.创建HashMap对象HashMap<Student,String> hmnew HashMap<>();//2、创建3个学生对…

SAP从放弃到入门系列之MRP中BOM的选择逻辑

翻译大佬的文章&#xff1a; 原文地址如下&#xff1a; 一、概述 BOM选择逻辑比较复杂&#xff0c;涉及到物料主数据的多个自定义和字段&#xff0c;所以我在这里总结一下。 首先&#xff0c;材料的 BOM 可能存在于下面的业务场景中。 1. 多个用途&#xff1a;例如生产BOM、…

怎么关闭管理员权限?

每台电脑在装上系统后&#xff0c;除你自己新建的账户外&#xff0c;会自动新建一个叫administrator的管理计算机(域)的内置账户&#xff0c;它平时是隐藏的&#xff0c;它是计算机管理员的意思&#xff0c;它拥有计算机管理的高权限&#xff0c;我们新建的账户都是在它之下派生…