【C++模板】模板实现通用的数组

简介: 【C++模板】模板实现通用的数组

案例描述: 实现一个通用的数组类

可以对内置数据类型以及自定义数据类型的数据进行存储

将数组中的数据存储到堆区

构造函数中可以传入数组的容量

提供对应的拷贝构造函数以及operator=防止浅拷贝问题

提供尾插法和尾删法对数组中的数据进行增加和删除

可以通过下标的方式访问数组中的元素

可以获取数组中当前元素个数和数组的容量

说明:首先写一个myArray.hpp代码,用于创建通用的数组。

#pragma once
#include<iostream>
using namespace std;

template<class T>
class MyArray
{


public:
  //构造函数 参数、容量
  MyArray(int capacity)
  {
    //cout << "正在调用有参构造" << endl;
    this->m_capacity = capacity;
    this->m_size = 0;
    //重新在堆区申请空间
    this->pAddress = new T[this->m_capacity];
  }
  //防止浅拷贝,写一个拷贝构造函数
  MyArray(const MyArray  &p)
  {
    //cout << "正在拷贝构造" << endl;
    this->m_capacity = p.m_capacity;
    this->m_size = p.m_size;
    //深拷贝
    this->pAddress = new T[p.m_capacity];;

    //将p中的数据拷贝过来
    for (int i = 0; i < p.m_size; i++)
      this->pAddress[i] = p.pAddress[i];
  }

  //防止浅拷贝另一个 : operator=
  MyArray& operator=(const MyArray & p)
  {
    //cout << "正在operate=构造" << endl;
    //先判断原来堆区是否有数据,如果有,先释放
    if (this->pAddress != NULL)
    {
      delete[] this->pAddress;
      this->m_capacity = 0;
      this->m_size = 0;
      this->pAddress = NULL;
    }
    //做深拷贝
    this->m_capacity = p.m_capacity;;
    this->m_size = p.m_size;
    this->pAddress = new T[p.m_capacity];
    //把原来数据传入尽量
    for (int i = 0; i < p.m_size; i++)
      this->pAddress[i] = p.pAddress[i];

    return *this;
  }


  //写一个尾插法
  void Push_back(const T &val)
  {
    if (this->m_capacity == this->m_size)
    {
      cout << "容器已经满" << endl;
      return;
    }
    this->pAddress[this->m_size] = val; //插入数据到尾部
    this->m_size++; //更新大小
  }
  //尾删法
  void Pop_back()
  {
    if (this->m_size == 0)
    {
      cout << "容器为空,不能再删除了" << endl;
      return;
    }
    this->m_size--;
  }

  //写一个运算符重载:通过下标的方式访问数组中的元素
  T & operator[](int index)
  {
    return this->pAddress[index];
  }

  //返回数组的容量
  int getCapacity()
  {
    return this->m_capacity;
  }

  //返回数组的大小
  int getSize()
  {
    return this->m_size;
  }

  //析构函数
  ~MyArray()
  {
    if (this->pAddress != NULL)
    {
      //cout << "正在调用析构函数" << endl;
      delete[] this->pAddress;
      this->pAddress = NULL; //置空,防止野指针
    }
  }




private:
  int m_size;
  int m_capacity;
  T * pAddress;

};

测试效果:

void showPrint(MyArray<int> &p)
{
  for (int i = 0; i < p.getSize(); i++)
    cout << p[i] << " ";
  cout << endl;
}


void test()
{
  MyArray<int> p(5);
  /*MyArray<int>p1(p);
  MyArray<int> p2(100);
  p2 = p1;*/
  for (int i = 0; i < 5; i++)
  {
    p.Push_back(i+1);
  }
  cout << "打印数组中的数据:" << endl;
  showPrint(p);
  cout << "数组的容量为:" << p.getCapacity()<< endl;
  cout << "数组的大小为:" << p.getSize() << endl;

  cout << "删除尾元素:" << endl;
  p.Pop_back();
  cout << "删除后,打印数组中的数据:" << endl;
  showPrint(p);
  cout << "删除后,数组的容量为:" << p.getCapacity() << endl;
  cout << "删除后,数组的大小为:" << p.getSize() << endl;
}

举例子测试:

void printPersonArray(MyArray<Person> &personArr)
{
  for (int i = 0; i < personArr.getSize(); i++) {
    cout << "姓名:" << personArr[i].m_Name << " 年龄: " << personArr[i].m_Age << endl;
  }
}

void test01()
{
  //创建数组
  MyArray<Person> pArray(10);
  Person p1("孙悟空", 30);
  Person p2("韩信", 20);
  Person p3("妲己", 18);
  Person p4("王昭君", 15);
  Person p5("赵云", 24);

  //插入数据
  pArray.Push_back(p1);
  pArray.Push_back(p2);
  pArray.Push_back(p3);
  pArray.Push_back(p4);
  pArray.Push_back(p5);

  printPersonArray(pArray);

  cout << "pArray的大小:" << pArray.getSize() << endl;
  cout << "pArray的容量:" << pArray.getCapacity() << endl;

}

目录
打赏
0
1
1
0
63
分享
相关文章
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
|
4月前
|
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
147 10
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
46 5
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
119 4
【C++】模板详细讲解(含反向迭代器)
C++模板是泛型编程的核心,允许编写与类型无关的代码,提高代码复用性和灵活性。模板分为函数模板和类模板,支持隐式和显式实例化,以及特化(全特化和偏特化)。C++标准库广泛使用模板,如容器、迭代器、算法和函数对象等,以支持高效、灵活的编程。反向迭代器通过对正向迭代器的封装,实现了逆序遍历的功能。
51 3
|
3月前
|
【c++】模板详解(1)
本文介绍了C++中的模板概念,包括函数模板和类模板,强调了模板作为泛型编程基础的重要性。函数模板允许创建类型无关的函数,类模板则能根据不同的类型生成不同的类。文章通过具体示例详细解释了模板的定义、实例化及匹配原则,帮助读者理解模板机制,为学习STL打下基础。
48 0
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
36 1
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
75 9
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
117 2
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等