当前位置: 首页 > article >正文

跟着官方文档学习UE C++ TArray容器系列 迭代

一.首先测试下,官方案例

迭代器的方法,有点不常见。有点像个指针,迭代完还自带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]);
	}
}


http://www.kler.cn/a/562757.html

相关文章:

  • 详解直方图均衡化
  • 【算法】哈希表详解
  • C语言实战项目(1)---------->猜数字游戏
  • Redis面试题----为什么要做Redis分区?
  • 基于springboot+vue的人工智能领域复合型人才校企协同培养管理系统
  • Python基于Django和Vue的校园互助平台(附源码、文档说明)
  • 【Uniapp-Vue3】点击将内容复制到剪切板
  • 使用 LangChain 和 Milvus 构建测试知识库
  • 【Jenkins】一种灵活定义多个执行label节点的jenkinsfile写法
  • Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(八)
  • 物联网综合实训室建设方案的探讨(职业院校物联网综合实训室建设方案)
  • Pytorch实现之浑浊水下图像增强
  • DeepSeek + 数据分析:让数据洞察更智能、更高效
  • 技术改变生活新趋势
  • RAG-202502
  • 解密ZAB协议:Zookeeper一致性的核心实现
  • WebSocket简单介绍 并接入deepseek
  • Golang `testing`包使用指南:单元测试、性能测试与并发测试
  • LeetCode热题100- 字符串解码【JavaScript讲解】
  • more than one owned sequence found.