C++ //模板案例-数组封装类
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++ //模板案例-数组封装类的更多相关文章
- YTU 2642: 填空题:类模板---求数组的最大值
2642: 填空题:类模板---求数组的最大值 时间限制: 1 Sec 内存限制: 128 MB 提交: 646 解决: 446 题目描述 类模板---求数组的最大值 找出一个数组中的元 ...
- 075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现
075 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 07 综合案例-数组移位-主方法功能4的实现 本文知识点:综合案例-数组移位-主方法功能4的实现 说明:因为 ...
- 074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现
074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现 本文知识点:综合案例-数组移位-主方法功能3的实现 说明:因为 ...
- 073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现
073 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 05 综合案例-数组移位-主方法功能1和2的实现 本文知识点:综合案例-数组移位-主方法功能1和2的实现 说 ...
- 072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法
072 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 04 综合案例-数组移位-在指定位置处插入数据方法 本文知识点:综合案例-数组移位-在指定位置处插入数据方法 ...
- 071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法
071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法 本文知识点:综合案例-数组移位-显示数组当中所有元素 ...
- 070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据
070 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 02 综合案例-数组移位-从键盘接收数据 本文知识点:综合案例-数组移位-从键盘接收数据 说明:因为时间紧张 ...
- 069 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 01 综合案例-数组移位-案例需求
069 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 01 综合案例-数组移位-案例需求 本文知识点:综合案例-数组移位-案例需求 说明:因为时间紧张,本人写博客 ...
- C++基础 (9) 第九天 编译器对模板类的二次编译 类模板 自定义数组类
1 昨日回顾 2 编译器对于模板的二次编译 写一个模板函数 然后进行调用 g++ template.cpp -o template // 汇编 g++ -S template.cpp –o templ ...
- C++——模板、数组类
1.函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 声明方法:template<typename 标识符> 函数声明 求绝对值的模板 #in ...
随机推荐
- 【k哥爬虫普法】Python程序员爬取视频资源13万部,一分钱没挣,获刑2年!
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...
- Jekyll安装
本文来自Jekyll官方文档. 简介 Jekyll是一个静态网站生成器,它可以把Markdown写就的文本根据指定的布局生成静态网站.你可以调整网站的外观.URL.页面展示数据等信息. 准备工作 Je ...
- 使用C#做为游戏开发的服务器语言方案
Scut开源服务器 开源C#/Python/Lua 手游服务器 主页:http://www.scutgame.com/index.html 开源:https://github.com/ScutGame ...
- vim 从嫌弃到依赖(2)——vim 模式
在上一篇文章中我们获取到了neovim 并对它进行了基础配置.现在已经具备一般编辑器的基本功能了.让我们先学会如何使用vim基本功能进行编辑,后面再看如何进行配置,以达到某某IDE或者编辑器的效果 v ...
- 微信小程序-页面生命周期方法
在经过上一篇文章的介绍之后,我们知道了大体的生命周期在什么时候执行,这次主要是以代码的形式来展示一下具体的阶段执行什么生命周期方法. 首先我们编写一个代码可以从首页跳转到日志页面: <!--in ...
- 深度学习实践篇[17]:模型压缩技术、模型蒸馏算法:Patient-KD、DistilBERT、DynaBERT、TinyBERT
深度学习实践篇[17]:模型压缩技术.模型蒸馏算法:Patient-KD.DistilBERT.DynaBERT.TinyBERT 1.模型压缩概述 1.2模型压缩原有 理论上来说,深度神经网络模型越 ...
- libuv计时器
目录 1.uv_timer_t - 计时器句柄 2.API 2.1.uv_timer_init 2.2.uv_timer_start 2.3.uv_timer_stop 2.4.uv_timer_ag ...
- AES算法:数据传输的安全保障
在当今数字化时代,数据安全成为了一个非常重要的问题.随着互联网的普及和信息技术的发展,我们需要一种可靠的加密算法来保护我们的敏感数据.Advanced Encryption Standard(AES) ...
- 一文搞懂 Vue3 defineModel 双向绑定:告别繁琐代码!
前言 随着vue3.4版本的发布,defineModel也正式转正了.它可以简化父子组件之间的双向绑定,是目前官方推荐的双向绑定实现方式. vue3.4以前如何实现双向绑定 大家应该都知道v-mode ...
- 如何修改OSW图表中显示的主机名称
本次测试的OSW版本:831 有人可能会说这种需求是吃饱了撑的吗,谁没事儿改这个名称干嘛啊? 其实并不是,因为有些生产案例非常典型,分享讲解时也需要配合OSW的趋势图来展示,但是出于保护客户隐私(哪怕 ...