首页 > 其他分享 >类模板案例——数组类封装(vector<>的逻辑代码)

类模板案例——数组类封装(vector<>的逻辑代码)

时间:2024-07-16 13:27:33浏览次数:16  
标签:arr 封装 Addres int vector 模板 capacity Arry size

.hpp文件

#pragma
#include<iostream>
using namespace std;

template<class T>
class My_arry
{
public:
	My_arry(int capacity)//赋初值
	{
		this->m_capacity = capacity;//容量
		this->m_Arry_size = 0;//大小
		this->m_Arry_Addres = new T[capacity];

	}
	My_arry(const My_arry &arr)//拷贝函数的深拷贝//arr1(arr2)
	{
		this->m_capacity = arr.m_capacity;
		this->m_Arry_size = arr.m_Arry_size;
		this->m_Arry_Addres = new T[arr.m_capacity];
		for (int i = 0; i < arr.m_Arry_size; i++)
		{
			this->m_Arry_Addres[i] = arr.m_Arry_Addres[i];
		}
	}
	My_arry& operator=(const My_arry& arr)//=运算符重载//arr1=arr2
	{
		if (this->m_Arry_Addres != NULL)//先将自身属性删除
		{
			delete[] this->m_Arry_Addres;
			this->m_Arry_Addres = NULL;
			this->m_Arry_size = 0;
			this->m_capacity = 0;
		}
		//然后进行深拷贝
		this->m_capacity = arr.m_capacity;
		this->m_Arry_size = arr.m_Arry_size;
		this->m_Arry_Addres = new T[arr.m_capacity];
		for (int i = 0; i < arr.m_Arry_size; i++)
		{
			this->m_Arry_Addres[i] = arr.m_Arry_Addres[i];
		}
		return *this;
	}
	//尾插法
	void Push_Back(const T val)
	{
		if (this->m_capacity == this->m_Arry_size)
		{
			cout << "数组已满" << endl;
			return;
		}
		this->m_Arry_Addres[this->m_Arry_size] = val;
		this->m_Arry_size++;//加完人后,数组大小++
	}
	//尾删除
	void Pop_Back()
	{
		if (this->m_Arry_size == 0)
		{
			cout << "数组为空" << endl;
			return;
		}
		this->m_Arry_size--;//逻辑删除,实际还是存在数据,可以用指定数字访问到
	}
	T& operator[](int index)//[]运算符重载,返回本身用T&
	{
		return this->m_Arry_Addres[index];
	}
	int Get_capacity()//获取数组容积
	{
		return this->m_capacity;
	}
	int Get_size()//获取数组大小
	{
		return this->m_Arry_size;
	}
	~My_arry()
	{
		if (this->m_Arry_Addres != NULL)
		{
			delete[] this->m_Arry_Addres;
			this->m_Arry_Addres = NULL;
		}
	}



	T* m_Arry_Addres;
	int m_capacity;
	int m_Arry_size;

};

.cpp文件

#include<iostream>
#include<string>
#include"classarry.hpp"
using namespace std;

void Print_arry(My_arry<int>&p)//打印内置类型数据的数组
{
	for (int i = 0; i < p.m_Arry_size; i++)
	{
		cout <<p[i]<< endl;
	}
}
class Person
{
public:
	Person() {};//这步不能少,不然this->m_Arry_Addres = new T[capacity];不能创建内存空间
	Person(string name,int age)
	{
		this->m_name = name;
		this->m_age = age;
	}
	string m_name;
	int m_age;
};
void test01()//测试存储内置类型数据的数组
{
	My_arry<int>arr1(5);
	for (int i = 0; i < arr1.m_capacity; i++)
	{
		arr1.Push_Back(i);
	}
	Print_arry(arr1);

}
void Print_Person(My_arry<Person>& p)//写在Person类后,写在前面要声明类
{
	for (int i = 0; i < p.Get_size(); i++)
	{
		cout << "姓名:" << p[i].m_name << " 年龄:" << p[i].m_age << endl;
	}
}
void test02()//测试存储自定义类型数据的数组
{
	Person p1("张三", 20);
	Person p2("李四", 15);
	Person p3("王五", 18);
	My_arry<Person>arr1(3);
	arr1.Push_Back(p1);
	arr1.Push_Back(p2);
	arr1.Push_Back(p3);
	Print_Person(arr1);
}
int main()
{
	test01();
	test02();
	system("pause");
	return 0;
}

标签:arr,封装,Addres,int,vector,模板,capacity,Arry,size
From: https://blog.csdn.net/weixin_74207910/article/details/140463689

相关文章

  • DedeCMS网站模板的title、description、keywords应该怎么写?
    首页​<title>{dede:global.cfg_webname/}-{dede:global.cfg_websubtitle/}</title><metaname="description"content="{dede:global.cfg_description/}"><metaname="keywords"content="{dede:global.cfg_k......
  • Lazarus 将LNET封装到DLL中
    最近工作中有个要求SOCKET的功能,想将一个通信功能做得简单一点。发现LNET非常方便,所以对它研究了一下。LNET有两种类型,可视化和非可视化。做WINDOWS下一般都是用可视化的。用于LINUX和WINCE,必须用非可视化的。我要将它封装成DLL的话,必须用非可视化的。DLL代码如下:librarypro......
  • 模板——函数模板的基本语法和调用规则
    1.模板函数    1.1分为自动类型堆到和显示指定类型template<classT>voidSwapNum(T&a,T&b){ Ttemp=a; a=b; b=temp;}voidtest01(){ inta=10; intb=20; doublec=30.5; doubled=40.8; SwapNum(a,b);//自动类型推导 SwapNum<in......
  • 数据库-SQL_duckdb向量化计算-vector
    duckdbDuckDB0.10.0引入了新的数据类型ArrayArray不同于Postgres的数组类型(Postgres的是可变长度的),DuckDB的Array列存储固定大小的数组目前相似度计算支持单精度浮点数(4字节)DuckDB的FLOAT4=numpy.float3目前vss功能还有待丰富--持续关注Vector向......
  • 易优CMS模板标签articlepay文章付费
      [基础用法]  标签:articlepay   描述:文章模型实现文章付费阅读,会员专享,会员付费,在使用之前先在文章模型开启付费阅读  属性:   aid=''文档id   id=''可以任意指定循环里的变量名替代c_field,假设id='c_field',模板调用如:{$c_field.hidden}变成 {$c_fiel......
  • 基于Go1.19的站点模板爬虫
    一、go语言简介Go(也被称为Golang)是一种开源的编程语言,由Google公司于2007年开始开发,并在2009年对外公开发布。Go语言的设计目标是提供一种简单、高效、安全的编程语言,适合并发编程和网络编程。以下是Go语言的一些特点和优势:简单易学:Go语言的语法简洁明了,只有25个关键字,......
  • 二分查找模板
    二分查找主要难点在于边界判定,逻辑相对简单,下文以力扣704.二分查找为例分析二分查找的代码模板。题目描述给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target ,写一个函数搜索 nums 中的target,如果目标值存在返回下标,否则返回-1。来源:力扣(LeetCode)原......
  • 快速排序模板及其理解
    快速排序在面试中经常用于考察面试者的代码能力,以下是我个人对如何手撕快排的一些理解:原理:快速排序的解决分为两个部分,分区(partition)和递归(recurse)。分区是主要进行排序的功能,递归用于控制分区的次数。分区的思想是:选定一个数,将所有小于这个数的数组元素都放在它的左侧,同理......
  • 面向2-封装、继承、多态
    封装、继承、多态继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模extands关键字扩展封装/*封装-隐藏内部信息,通过接口访问1、“高内聚,低耦合”-该露的露,该藏得藏属性私有,get/set2、提高程序的安全性,保护数据3、隐藏代码的实现细节4、统一接口5、提高系统的......
  • 硬件开发笔记(二十六):AD21导入电感原理图库、封装库和3D模型
    前言  电阻,电容,电感还有各种基础的电子元器件、连接器和IC构成了各种实现功能的电子电路。  本篇介绍电感,并将贴片电感封装导入AD21,预览其三维模型。 贴片电感  贴片电感作为电子元件中的重要一员,因其小型化、高品质、高能量储存和低电阻等特性,在电子线路中发挥......