1 //模板案例-数组封装类
2 //描述
3 //实现一个通用的数组类
4 //1.可以对内置数据类型以及自定义数据类型的数据进行储存
5 //2.将数组很脏的数据储存到堆区
6 //3.构造函数中可以传入数组的容量
7 //4.提供对应的拷贝构造函数以及operator=防止浅拷贝问题
8 //5,提供尾插法和尾删法对数组中的数据进行增加和删除
9 //6.可以通过下标的方式访问数组的元素
10 //7.可以获取数组在当前元素个数和数组的容量
11
12 #include <iostream>
13 #include <string>
14 #include<fstream>
15 #include"MyArray.hpp"
16 using namespace std;
17
18 void printfIntArray(MyArray <int>&arr)
19 {
20 for (int i = 0; i < arr.getSize(); i++)
21 {
22 cout << arr[i] << endl;
23 }
24 }
25
26
27 void test01()
28 {
29 MyArray <int>arr1(5);
30
31 for (int i = 0; i < 5; i++)
32 {
33 //利用尾插法向数组中插入数据
34 arr1.Push_Back(i);
35 }
36 cout << "arry1的打印输出为: " << endl;
37 printfIntArray(arr1);
38
39 cout << "arr1的容量为: " << arr1.getCapacity() << endl;
40 cout << "arr1的大小为: " << arr1.getSize() << endl;
41
42
43 cout << "arry2的打印输出为: " << endl;
44 MyArray<int>arr2(arr1);
45 printfIntArray(arr2);
46
47 //尾删
48 arr2.Pop_Back();
49 cout << "arr2尾删后: " << endl;
50
51 cout << "arr2的容量为: " << arr2.getCapacity() << endl;
52 cout << "arr2的大小为: " << arr2.getSize() << endl;
53 //MyArray<int>arr3(100);
54 //arr3 = arr1;
55 }
56
57 //测试自定义数据类型
58 class Person
59 {
60 public:
61
62 Person()
63 {
64
65 }
66 Person(string name, int age)
67 {
68 this->m_Name = name;
69 this->m_Age = age;
70 }
71
72
73 string m_Name;
74 int m_Age;
75 };
76 void printPersonArray(MyArray<Person>& arr)
77 {
78 for (int i = 0; i < arr.getSize(); i++)
79 {
80 cout << "姓名: " << arr[i].m_Name << " 年龄:" << arr[i].m_Age << endl;
81
82
83 }
84 }
85 void test02()
86 {
87 MyArray<Person>arr(10);
88
89 Person p1("张三", 200);
90 Person p2("李四",20);
91 Person p3("王五", 30);
92 Person p4("赵六",99);
93 Person p5("孙七", 48);
94
95 //将数据插入到数组中
96 arr.Push_Back(p1);
97 arr.Push_Back(p2);
98 arr.Push_Back(p3);
99 arr.Push_Back(p4);
100 arr.Push_Back(p5);
101
102 //打印数组
103 printPersonArray(arr);
104
105 //打印容量
106 cout << "arr容量为:" << arr.getCapacity() << endl;
107
108 //打印大小
109 cout << "arr容量为:" << arr.getSize() << endl;
110
111 }
112 int main()
113 {
114
115 test01();
116 test02();
117
118 system("pause");
119
120 return 0;
121
122 }
  1 MyArray.hpp
2
3 #pragma once
4 //自己的通用数组类
5 #include<iostream>
6 using namespace std;
7
8 template<class T>
9 class MyArray
10 {
11 public:
12
13 //有参构造 参数 容量
14 MyArray(int capacity)
15 {
16 //cout << "Myarray有参构造调用"<<endl;
17 this->m_Capacity = capacity;
18 this->m_Size = 0;
19 this->pAddress = new T[this->m_Capacity];
20 }
21 //拷贝构造
22 MyArray(const MyArray& arr)
23 {
24 //cout << "Myarray有拷贝造调用" << endl;
25 this->m_Capacity = arr.m_Capacity;
26 this->m_Size = arr.m_Size;
27 //this->pAddress = arr.pAddress;
28
29
30 //深拷贝
31 this->pAddress = new T[arr.m_Capacity];
32
33 //将arr中的数据都拷贝过来
34 for (int i = 0; i < this->m_Size; i++)
35 {
36 this->pAddress[i] = arr.pAddress[i];
37 }
38
39
40 }
41 //operator =防止浅拷贝的问题 a = b =c
42 MyArray& operator = (const MyArray& arr)
43 {
44 //cout << "Myarray的 operator= 调用" << endl;
45 //先判断原来堆区是否有数据 如果有先释放
46 if (this->pAddress != NULL)
47 {
48 delete[]this->pAddress;
49 this->pAddress = NULL;
50 this->m_Capacity = 0;
51 this->m_Size = 0;
52 }
53
54 //深拷贝
55 this->m_Capacity = arr.m_Capacity;
56 this->m_Size = arr.m_Size;
57 this->pAddress = new T[arr.m_Capacity];
58 for (int i = 0; i < this->m_Size; i++)
59 {
60 this->pAddress[i] = arr.pAddress[i];
61 }
62 return *this;
63 }
64
65 //尾插法
66 void Push_Back(const T &val)
67 {
68 //判断容量是否等于大小
69 if (this->m_Capacity == this->m_Size)
70 {
71 return;
72 }
73 //在数组末尾插入数据
74 this->pAddress[this->m_Size] = val;
75 this->m_Size++; //更新数组大小
76 }
77 //尾删法
78 void Pop_Back()
79 {
80 //让用户访问不到最后一个元素,即为尾删,逻辑删除
81 if (this->m_Size == 0)
82 {
83 return;
84 }
85 this->m_Size--;
86 }
87
88 //通过下标的方式访问数组中的元素
89 T& operator[](int index)
90 {
91 return this->pAddress[index];
92 }
93
94 //返回数组的容量
95 int getCapacity()
96 {
97 return this->m_Capacity;
98 }
99 //返回数组大小
100 int getSize()
101 {
102 return this->m_Size;
103 }
104
105
106
107
108
109 //析构函数
110 ~MyArray()
111 {
112 if (this->pAddress != NULL)
113 {
114 //cout << "Myarray析构函数调用" << endl;
115 delete[] this->pAddress;
116 this->pAddress = NULL;
117 }
118 }
119 private:
120
121 T* pAddress; //指针指向堆区开辟的真时数组
122
123 int m_Capacity; //数组容量
124
125 int m_Size; //数组大小
126 };

C++ //模板案例-数组封装类的更多相关文章

  1. YTU 2642: 填空题:类模板---求数组的最大值

    2642: 填空题:类模板---求数组的最大值 时间限制: 1 Sec  内存限制: 128 MB 提交: 646  解决: 446 题目描述   类模板---求数组的最大值    找出一个数组中的元 ...

  2. 075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现

    075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现 本文知识点:综合案例-数组移位-主方法功能4的实现 说明:因为 ...

  3. 074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现

    074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现 本文知识点:综合案例-数组移位-主方法功能3的实现 说明:因为 ...

  4. 073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现

    073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现 本文知识点:综合案例-数组移位-主方法功能1和2的实现 说 ...

  5. 072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法

    072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法 本文知识点:综合案例-数组移位-在指定位置处插入数据方法 ...

  6. 071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法

    071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法 本文知识点:综合案例-数组移位-显示数组当中所有元素 ...

  7. 070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据

    070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据 本文知识点:综合案例-数组移位-从键盘接收数据 说明:因为时间紧张 ...

  8. 069 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 01 综合案例-数组移位-案例需求

    069 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 01 综合案例-数组移位-案例需求 本文知识点:综合案例-数组移位-案例需求 说明:因为时间紧张,本人写博客 ...

  9. C++基础 (9) 第九天 编译器对模板类的二次编译 类模板 自定义数组类

    1 昨日回顾 2 编译器对于模板的二次编译 写一个模板函数 然后进行调用 g++ template.cpp -o template // 汇编 g++ -S template.cpp –o templ ...

  10. C++——模板、数组类

    1.函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 声明方法:template<typename 标识符> 函数声明 求绝对值的模板 #in ...

随机推荐

  1. 从零开始配置 vim(18)——终端模式

    在进入下一个配置之前,先了解一下如何在 neovim 中使用它内置的终端. 我们之前说过在命令模式中可以使用 !来执行shell命令.但是终归来说,执行和使用上不是那么方便,特别是混合使用 vim 命 ...

  2. 搭建mongo的replica set

    搭建mongo的replica set 前言 安装 构建副本集 加入认证 备份数据 备份数据到本地 数据恢复 搭建mongo的replica set 前言 准备三台机器,相互可以访问的.处理思路,先构 ...

  3. 十八张图带你入门实时监控系统HertzBeat

    我们经常讲:研发人员有两只眼睛,一只是监控平台,另一只是日志平台.在对性能和高可用讲究的场景里,监控平台的重要性再怎么强调也不过分. 这篇文章,我们聊聊开源实时监控告警系统 HertzBeat 赫兹跳 ...

  4. delphi IDE 控件居中的方法

  5. JS leetcode 旋转数组 题解分析

    壹 ❀ 引 今天来做一道同样简单,但是挺有趣的题,题目来自leetcode189. 旋转数组,题目描述如下: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: ...

  6. NC19429 红球进黑洞

    题目链接 题目 题目描述 在心理疏导室中有一种奇特的疏导工具,叫做红球.红球被提前分为了许多正方形小方格. 每当有人来找ATB做心理疏导时,ATB就会让他去先玩红球,然后通过红球小格方的高度来判断一个 ...

  7. SSD 接口简介——M.2/U.2

    一,M.2 - the Next Generation Form Factor (NGFF) 从名字上可以看出M.2在最初主要关于新一代尺寸的规格,它定义了以下几种尺寸,类似于内存条的样子. M.2 ...

  8. MySQL专题2: 事务和锁

    合集目录 MySQL专题2: 事务和锁 说说数据库事务特性及存在的问题 这属于数据库事务的基础概念了, 就是ACID Atomicity, 原子性, 事务包含的所有操作要么全部成功, 要么全部失败回滚 ...

  9. DS1302与STC12的连接电路和驱动实现

    简介 DS1302是低功耗带RAM的实时时钟电路, 常见的SOP8封装体积很小, 它可以对年月日周时分秒进行计时, 具有闰年补偿功能, 工作电压为2.0V-5.5V, 采用三线接口与CPU进行同步通信 ...

  10. fold命令

    fold命令 fold命令用于限制文件列宽,其会从指定的文件里读取内容,将超过限定列宽的列加入增列字符后,输出到标准输出设备.若不指定任何文件名称,或是所给予的文件名为-,则fold命令会从标准输入设 ...