#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];
}
UE TArray
2024-03-16 07:08:03 34 阅读