当前位置: 首页 > article >正文

手写 UE4中的 TArray

#pragma once
#include<iostream>
#include<stdexcept>
#define CHECK_INDEX_RANGE(Index) if (Index >= ElementCount) throw std::out_of_range("索引超出界限")

template<typename ElementType>
class TArray
{
	typedef unsigned int uint;
private:
	// 数组的容量
	uint Capacity;
	// 数组中元素的数量
	uint ElementCount;
	// 数组的指针
	ElementType* Data;
public:
	TArray();
	// 往数组中添加元素
	void Add(const ElementType& NewElement);
	inline uint GetSize()
	{
		return ElementCount;
	}
	// 1.返回特定元素的索引,如果没有改元素,返回-1
	int GetElenmentIndex(const ElementType& Element);
	// 2.在特定位置插入元素
	void InsertElenmentByIndex(const int& Index, const ElementType& Element);
	// 3.删除特定位置元素
	void DeleteElementByIndex(const int& index);
	// 4.将特定索引处的元素和另外一个特定索引处的元素互换
	void SwapElementByIndex(const int&IndexA,const int &  IndexB);
	// 5.反转整个数组
	void Reverse();
	// * 打乱整个数组
	void Shuffle();
	// 检查容量
	void CheckCapacity();
	// 运算符的重载
	ElementType& operator[](uint Index);
};

template<typename ElementType>
inline TArray<ElementType>::TArray()
{
	ElementCount = 0u;
	Capacity = 8u;
	Data = new ElementType[Capacity];
}

template<typename ElementType>
inline void TArray<ElementType>::Add(const ElementType& NewElement)
{
	CheckCapacity();
	Data[ElementCount] = NewElement;
	ElementCount++;
}

template<typename ElementType>
inline int TArray<ElementType>::GetElenmentIndex(const ElementType& Element)
{
	for (int i = 0; i < GetSize(); i++)
	{
		if (Data[i] == Element) 
		{
			return i;
		}
	}
	return -1;
}

template<typename ElementType>
inline void TArray<ElementType>::InsertElenmentByIndex(const int& Index, const ElementType& Element)
{
	CHECK_INDEX_RANGE(Index);
	// 从最后一个元素开始往后移动
	ElementCount++;
	CheckCapacity();
	for (int i = ElementCount; i>=Index;i--)
	{
		Data[i] = Data[i - 1];
	}
	Data[Index] = Element;
}

template<typename ElementType>
inline void TArray<ElementType>::DeleteElementByIndex(const int& index)
{
	// 将所有的元素向前移动
	for (int i = index; i < ElementCount; i++) 
	{
		Data[i] = Data[i + 1];
	}
	ElementCount -= 1;
}

template<typename ElementType>
inline void TArray<ElementType>::SwapElementByIndex(const int& IndexA, const int& IndexB)
{
	CHECK_INDEX_RANGE(IndexA);
	CHECK_INDEX_RANGE(IndexB);
	ElementType TempElement;
	TempElement = Data[IndexA];
	Data[IndexA] = Data[IndexB];
	Data[IndexB] = TempElement;
}

template<typename ElementType>
inline void TArray<ElementType>::Reverse()
{
	// 方法一:创建一个新的数组
	/*auto NewData = new ElementType[ElementCount];
	for (int i = 0,j=ElementCount-1; i < ElementCount; i++,j--)
	{
		NewData[i] = Data[j];
	}
	delete Data;
	Data = NewData;*/

	// 方法二:将第一个和最后一个交换 ,第二个和倒数第二个交换,以此类推
	int EndIndex = ElementCount-1;
	for (int i = 0; i < ElementCount/2; i++)
	{
		SwapElementByIndex(i,EndIndex--);
	}
}

template<typename ElementType>
inline void TArray<ElementType>::Shuffle()
{
	// 将每个元素和随机生成的索引所在的元素进行交换
	for (int i = 0; i < ElementCount; i++)
	{
		int RandomIndex = rand() % (ElementCount-1);
		SwapElementByIndex(i, RandomIndex);
	}
}

template<typename ElementType>
inline void TArray<ElementType>::CheckCapacity()
{
	// 数组空间不够,申请空间
	if (Capacity <= ElementCount) 
	{
		auto NewData = new ElementType[Capacity * 2];
		// 将原来的数组中的数据搬到新的数组中
		memcpy(NewData, Data, sizeof(ElementType) * ElementCount);
		// 清空指针指向的内存中的数据,指针还是指向原来的地址
		delete Data;
		Data = NewData;
	}
}

template<typename ElementType>
inline ElementType& TArray<ElementType>::operator[](uint Index)
{
	CHECK_INDEX_RANGE(Index);
	return Data[Index];
}

http://www.kler.cn/a/274146.html

相关文章:

  • Xshell 和 Xftp 更新提示问题的解决方法及分析
  • 5.近实时数仓数据更新和ID 管理上的优化方案
  • C++--------效率和表示
  • 基于谱聚类的多模态多目标浣熊优化算法(MMOCOA-SC)求解ZDT1-ZDT4,ZDT6和工程应用--盘式制动器优化,MATLAB代码
  • 微信小程序-基于Vant Weapp UI 组件库的Area 省市区选择
  • 简述Git中如何将一个新增文件添加到本地仓库?
  • 【JAVA快速编写UI】 Java 编写一个编码转换和加解密工具,可以创建一个简单的 GUI 应用程序(例子)
  • 力扣大厂热门面试算法题 43-45
  • 企企通:AI技术赋能供应链智能化升级,打造数字产业集群
  • 前端流式(stream)请求,获取持续响应的方式
  • 基于java的宠物信息交流平台设计(含源文件)
  • json-server库的使用,实现数据模拟
  • PyTorch学习笔记之基础函数篇(十三)
  • Spring Security的开发
  • Python-GEE绘制DEM精美图片
  • iOS图片占内存大小与什么有关?
  • OSPF特殊区域(stub\nssa)
  • 电商数据采集效率开挂【Python电商数据采集API接口】
  • Jenkins实现CICD(3)_Jenkins连接到git
  • AIGC元年大模型发展现状手册
  • Java 环境一键部署
  • 赛道快马问题
  • 香港科技大学广州|智能制造学域博士招生宣讲会—同济大学专场
  • 基于单片机的模糊PID炉温控制系统设计
  • bios开启secure boot选项,进行pxe安装操作系统时报错,求解决办法
  • 海外代理IP在跨境电商中的五大应用场景