美文网首页
类模版创建数组

类模版创建数组

作者: Sheik | 来源:发表于2021-08-04 23:01 被阅读0次

环境:ide:Mac+clion

视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5

需求:通过模版类,实现一个数组。

#include <iostream>

using namespace std;
#ifndef CHAPTER6_MYARRAY_HPP
#define CHAPTER6_MYARRAY_HPP


template<class T>
class MyArray {

public:
    //构造函数
    MyArray(int len) {
        cout << "MyArray 构造函数调用" << endl;
        this->m_Capacity = len;//这里设定容量大小,构造函数传递进来。
        this->address = new T[len];
        m_Size = 0;
    }

    //尾插法
    void push_back(const T &data) {
        if (this->m_Capacity > this->m_Size) {
            this->address[this->m_Size] = data;//这个是再数组后面插入数据。
            this->m_Size++;//数组大小进行更新。
        } else {
            cout << "已经超过容量,无法再插入。"<<endl;
            return;
        }
    }

    //尾删法
    void pull_back(){
        if (this->m_Size == 0){
            cout << "数组为空,无法删除数据。"<<endl;
            return;
        }
//        this->address[this->m_Size] = NULL;//删除最后一个数据,可以不进行设置为空,通过下面代码进行违删除
        this->m_Size--;//更新数组的大小。
    }

    //获取容量
    int getCapacity(){
        return this->m_Capacity;
    }

    //获取数组大小
    int getArraySize(){
        return this->m_Size;
    }

    //通过下标方式访问。
    T & operator[](int index){
        return this->address[index];
    }

    //有了构造就需要析构函数
    ~MyArray() {
        if (this->address != NULL) {
            cout << "MyArray 析构函数调用" << endl;
            delete[]this->address;
            this->address = NULL;
        }
    }

    //拷贝构造函数
    MyArray(const MyArray &arr) {
        cout << "MyArray 拷贝函数调用" << endl;
        this->m_Size = arr.m_Size;
        this->m_Capacity = arr.m_Capacity;
//        this->address = arr.address;//这就是浅拷贝。会在析构中删除,
        this->address = new T[arr.m_Capacity];//这里是为了解决浅拷贝的问题。
        for (int i = 0; i < this->m_Size; i++) {
            this->address[i] = arr.address[i];//这里如果在传递过来的arr 中,如果有其他数据,需要逐一进行拷贝过来。
        }
    }

    //重载operator=,注意这里需要返回MyArray&,返回这个可以直接进行链式赋值。
    MyArray &operator=(const MyArray &arr) {
        cout << "MyArray 赋值函数调用" << endl;
        this->m_Size = arr.m_Size;
        this->m_Capacity = arr.m_Capacity;
        if (this->address != NULL) {
            delete[]this->address;
            this->address = NULL;
            m_Size = 0;
            m_Capacity = 0;
        }
        this->address = new T[arr.m_Capacity];
        for (int i = 0; i < this->m_Size; i++) {
            this->address[i] = arr.address[i];//这里如果在传递过来的arr 中,如果有其他数据,需要逐一进行拷贝过来。
        }
        return *this;
    }

private:
    T *address;//用来维护数组里面的数据。
    int m_Size;//当前数组的大小。
    int m_Capacity;//数组的容量。
};

#endif //CHAPTER6_MYARRAY_HPP

测试代码如下:

#include "MyArray.hpp"

void test(){//测试代码
    MyArray<int>arry1 (5);
    MyArray<int>arry2(arry1);
    MyArray<int>arry3(200);
    arry1 = arry3;
//    以上的输出如下:
//    MyArray 构造函数调用
//    MyArray 拷贝函数调用
//    MyArray 构造函数调用
//    MyArray 赋值函数调用
//    MyArray 析构函数调用
//    MyArray 析构函数调用
//    MyArray 析构函数调用

}

void myPrint(MyArray<int> &arry1){
    for (int i=0;i<arry1.getArraySize();i++){
        cout << arry1[i]<<endl;
    }
}


void test1(){
    MyArray<int>arry1 (5);
    for (int i = 0;i<3;i++){
        arry1.push_back(i);
    }
    myPrint(arry1);
    cout << "删除前容量:"<<arry1.getCapacity()<<endl;//5
    cout << "删除前大小:"<<arry1.getArraySize()<<endl;//3
    arry1.pull_back();
    cout << "删除后容量:"<<arry1.getCapacity()<<endl;//5
    cout << "删除后大小:"<<arry1.getArraySize()<<endl;//2
}

class Person{
public:
    Person(){//这个必须存在,类模版初始化的时候需要。
    }
    Person(string name,int age){
       this->m_Name = name;
       this->m_Age = age;
    }
    string m_Name;
    int m_Age;
};

//测试自定义数据类型
void test2(){
    MyArray<Person>arry(5);
    Person p1("sheik1",1);
    Person p2("sheik2",2);
    arry.push_back(p1);
    arry.push_back(p2);
    for (int i=0;i<arry.getArraySize();i++){
        cout << "姓名: "<< arry[i].m_Name<<" 年龄: "<<arry[i].m_Age<<endl;
    }
    cout << "删除前容量:"<<arry.getCapacity()<<endl;
    cout << "删除前大小:"<<arry.getArraySize()<<endl;
    arry.pull_back();
    cout << "删除后容量:"<<arry.getCapacity()<<endl;
    cout << "删除后大小:"<<arry.getArraySize()<<endl;
}

相关文章

  • 类模版创建数组

    环境:ide:Mac+clion 视频链接:https://www.bilibili.com/video/BV1H...

  • Dart类模版创建

    新建Dart文件模版,仅限Android Studio开发; 目前新建Dart文件之后,是一个空类,不包含任何代码...

  • 创建xcode类模版

    采取由拷贝系统的配置进行自定义更改。路径是/Applications/Xcode.app/Contents/Dev...

  • IDEA快速生成类注释模版

    一、在创建类文件时,自动生成类注释模版,可以使用 File and Code Templates 模版样例 二、在...

  • 匿名内部类熟悉

    首先熟悉一下匿名内部类 类:是可以看成模版,通过模版创建对象,模版重复利用创建多个对象;如果一个场景只需要创建一个...

  • Foundation基础类库容器

    基础类库:容器 1.NSArray //类方法数组创建 //实例方法创建数组 //数组个数 //访问元素 //追加...

  • 数组的基本操作

    遍历数组 例题 创建类Trap 创建类Tautog 填充替换数组元素 1.fill(int[] a,int val...

  • C++11——重载操作与转换

    function类模版 function是一个模版。与我们使用的其他模版一样,当我们创建一个function类型时...

  • js - 学习笔记

    方法 对象 类 数组循环(for...in) 迭代(for...of) 模块 其他进制转换文字模版symbol()...

  • 第 13 章 数组类

    第 13 章 数组类 13.1 复习数组 数组是带索引的对象的集合。 13.2 数组的创建方法 使用 [] 创建数...

网友评论

      本文标题:类模版创建数组

      本文链接:https://www.haomeiwen.com/subject/jofpvltx.html