手写 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];
}

相关推荐

  1. UE4 TArray

    2024-03-16 07:08:03       38 阅读
  2. <span style='color:red;'>UE</span> <span style='color:red;'>TArray</span>

    UE TArray

    2024-03-16 07:08:03      34 阅读
  3. c++bitset

    2024-03-16 07:08:03       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 07:08:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 07:08:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 07:08:03       82 阅读
  4. Python语言-面向对象

    2024-03-16 07:08:03       91 阅读

热门阅读

  1. DNSlog漏洞探测

    2024-03-16 07:08:03       31 阅读
  2. 【Hadoop】 Hive:内部表与外部表的创建与查看

    2024-03-16 07:08:03       37 阅读
  3. 什么是设计模式?

    2024-03-16 07:08:03       40 阅读
  4. 使用VLC实现自动播放视频

    2024-03-16 07:08:03       40 阅读
  5. HTML5、CSS3面试题(三)

    2024-03-16 07:08:03       43 阅读
  6. oracle数据库字符集

    2024-03-16 07:08:03       52 阅读
  7. 关于用文心一言解读Autosar和UDS

    2024-03-16 07:08:03       48 阅读
  8. 主成分分析用于数据降维

    2024-03-16 07:08:03       39 阅读