一.首先测试下,官方案例
迭代器的方法,有点不常见。有点像个指针,迭代完还自带break.
oid AWXTArrayActor::WXLoopArray()
{FString JoinedStr1;FString JoinedStr2;TArray<FString> StrArr = { "Hello","Baby","Fuck" };for (auto& Str : StrArr){JoinedStr1 += Str;JoinedStr1 += TEXT(" ");}// JoinedStr == "Hello Brave World of Tomorrow !"for (auto Str : StrArr){JoinedStr2 += Str;JoinedStr2 += TEXT(" ");}
}void AWXTArrayActor::WXLoopArray2()
{FString JoinedStr;TArray<FString> StrArr = { "Hello","Baby","Fuck" };for (int32 Index = 0; Index != StrArr.Num(); ++Index) //{JoinedStr += StrArr[Index];JoinedStr += TEXT(" ");}
}void AWXTArrayActor::WXLoopArray3()
{FString JoinedStr;TArray<FString> StrArr = { "Hello","Baby","Fuck" };for (auto It = StrArr.CreateConstIterator(); It; ++It) //It指向数组的首元素,这个地址。最后指向数组后一个0,跳出循环{JoinedStr += *It;JoinedStr += TEXT(" ");}}
二. 可能导致的错误用法,将某个元素替换
void AWXTArrayActor::WXLoopArray_Error()
{FString JoinedStr;TArray<FString> StrArr = { "Hello","Baby","of","Fuck"};for (int32 Index = 0; Index != StrArr.Num(); ++Index) //{if (TEXT("of") == StrArr[Index]){StrArr.RemoveAt(Index); //Remove}else{JoinedStr += StrArr[Index];JoinedStr += TEXT(" ");}}
}
注意一定要分帧执行
WebSocket通信过程去创建WebSocket,要下一帧执行。 类似WXLoopArray_Error(),容器不要在遍历的时候去删。
这种错误,是因为容器在RemoveAt的时候,已经将容器内部进行了,位置的前移这种操作。你不能默认它没有移动。
三.解决方案
倒着迭代 ,拼接将后面的元素也拼上。
void AWXTArrayActor::WXLoopArray_Right()
{FString JoinedStr;TArray<FString> StrArr = { "Hello","Baby","of","Fuck" };for (int32 Index = StrArr.Num()-1; Index >= 0; --Index) //{if (TEXT("of") == StrArr[Index]){StrArr.RemoveAt(Index);}else{JoinedStr = StrArr[Index] + TEXT(" ")+JoinedStr;}}
}
另开一个存储,要删数组的下标。
void AWXTArrayActor::WXLoopArray_Right2()
{TArray<FString> StrArr = { "Hello","My","Baby","of","Fuck"};TArray<int32> RemoveIndexArray;for (int32 Index = StrArr.Num() - 1; Index >= 0 ;--Index){if (TEXT("of") == StrArr[Index]){RemoveIndexArray.Add(Index);}if (TEXT("My") == StrArr[Index]){RemoveIndexArray.Add(Index);}}for (int32 RemovedLoopIndex = 0; RemovedLoopIndex != RemoveIndexArray.Num(); ++RemovedLoopIndex){StrArr.RemoveAt(RemoveIndexArray[RemovedLoopIndex]);}
}
四.
1.排序,先看官方文档
2.实现测试用例
这个排序Sort 和 堆排序,不区分大小写。每次排序都差不多一个结果。大小写,他们是一样的。
void AWXTArrayActor::WXSortArray_Sort()
{TArray<FString> StrArr = { "aa","AA","AB","ab","ABC","BB","VE","AA","CCCC","AD","DDDDDDDA"};StrArr.Sort(); //按字典
}void AWXTArrayActor::WXSortArray_HeapSort()
{TArray<FString> StrArr = { "aa","AA","AB","ab","ABC","BB","VE","AA","CCCC","AD","DDDDDDDA" };StrArr.HeapSort(); //按字典
}void AWXTArrayActor::WXSortArray_StableSort() //稳定排序,有排序后的等值元素的相对顺序
{TArray<FString> StrArr = { "aa","AA","AB","ab","ABC","BB","VE","AA","CCCC","AD","DDDDDDDA" };StrArr.StableSort(); //按字典
}