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

跟着官方文档学习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]);
	}
}

相关文章:

  • Python 3 实用工具库
  • C++基础03(面向对象)
  • 36. 有效的数独
  • 【deepseek】本地部署+webui访问
  • 论文阅读笔记:Continual Forgetting for Pre-trained Vision Models
  • Imagination GPU 3D Graphics Wrokload
  • linux基础语法2
  • 开源文件存储系统
  • 提升数据洞察力:五款报表软件助力企业智能决策
  • 【Mysql】我在广州学Mysql 系列—— 性能优化相关例题
  • 设计模式之代理设计模式
  • nodejs用ws模块反向代理socks5数据,即用ws写服务端和客户端及加密
  • Spring Boot + Apache POI 实现 Excel 导出:BOM物料清单生成器(支持中文文件名、样式美化、数据合并)
  • 2.26 notes on cxl
  • AI工具库:技术爱好者装备新势能
  • debian 12安装 postgresql 17
  • Idea java项目结构介绍
  • 使用插件 `vue2-water-marker`添加全局水印
  • 拐弯的时间线
  • 通过返回的key值匹配字典中的value值
  • 网站设计的基本方法/百度云服务器官网
  • 太原企业网站制作/上海seo推广方法
  • 非认证公众号wordpress/seo外链在线工具
  • 怎样做校园网站/网站推广排名服务
  • 做得好的网站建设公司/google 谷歌
  • 政府网站信息内容建设不/淘宝推广公司