一.首先測試下,官方案例
迭代器的方法,有點不常見。有點像個指針,迭代完還自帶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(); //按字典
}