一.首先测试下,官方案例
迭代器的方法,有点不常见。有点像个指针,迭代完还自带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]);
}
}