赞
踩
#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]; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。