【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;

}

相关文章
|
2月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
112 10
|
27天前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
42 4
|
27天前
|
算法 编译器 C++
【C++】模板详细讲解(含反向迭代器)
C++模板是泛型编程的核心,允许编写与类型无关的代码,提高代码复用性和灵活性。模板分为函数模板和类模板,支持隐式和显式实例化,以及特化(全特化和偏特化)。C++标准库广泛使用模板,如容器、迭代器、算法和函数对象等,以支持高效、灵活的编程。反向迭代器通过对正向迭代器的封装,实现了逆序遍历的功能。
34 3
|
1月前
|
编译器 C++
【c++】模板详解(1)
本文介绍了C++中的模板概念,包括函数模板和类模板,强调了模板作为泛型编程基础的重要性。函数模板允许创建类型无关的函数,类模板则能根据不同的类型生成不同的类。文章通过具体示例详细解释了模板的定义、实例化及匹配原则,帮助读者理解模板机制,为学习STL打下基础。
31 0
|
2月前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
18 1
|
2月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
60 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2月前
|
算法 编译器 C++
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
88 2
|
2月前
|
存储 编译器 C++
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
45 2
|
2月前
|
存储 算法 编译器
【C++】初识C++模板与STL
【C++】初识C++模板与STL
|
2月前
|
编译器 C++
【C++】模板进阶:深入解析模板特化
【C++】模板进阶:深入解析模板特化
104 0