UE4-数据结构-TMap

  • UE4-容器-数据结构-TMap
  • Time: 2020年10月13日16:31:22
  • author: Yblackd

@


1. 创建TMap

`TMap<int32, FString> TestMap;`

2. 增

2.1 方法

  • add
  • Emplace
  • Append
  • add | Emplace: 两者功能类似,都是将kv添加到TMap
  • Append:类似Python的append,将一个容器中的元素 逐个取出 添加到另外一个容器

2.2 特点注意

  • 类似Python的 字典,
  • 排列无序
  • key唯一,(TMultiMap的key不是唯一)
  • 值不传设置默认值(空值)

2.3 方法案例

// add: 给TestMap 添加数据
TestMap.add(1, TEXT("YangDong"));
TestMap.add(2, TEXT("杨东"));
// 添加后 结果
TestMap == [
    {key:1, Value:"YangDong"},
    {key:2, Value:"杨东"}
]

// Emplace: 定义TestMap2 并添加数据
TMap<int32, FString> TestMap2;
TestMap2.Emplace(3, TEXT("ZhangSan"));
TestMap2.Emplace(4, TEXT("LiSi"));

// Append: 将TestMap2 中数据逐个追加到 TestMap
TestMap.Append(TestMap2);
// 添加后 结果 
TestMap == [
    {key:1, Value:"YangDong"},
    {key:2, Value:"杨东"},
    {key:3, Value:"ZhangSan"},
    {key:4, Value:"LiSi"},
]

3. 查-遍历

3.1(C++ ranged-for)

? 遍历TMap与遍历TArray类似

for (auto& Test : TestMap)
{
	UE_LOG(LogClass, Log, TEXT("Key": %d Value: "%s"), Test.key, Test.Value);
}

// OutPut:
key: 1 	Value: YangDong
key: 2 	Value: 杨东
key: 3 	Value: ZhangSan
key: 4 	Value: LiSi

3.2 迭代器

? 使用迭代器CreateIterator或CreateConstIterator

for (auto Test = 	TestMap.CreateConstIterator(); Test; ++Test)
{
    UE_LOG(LogClass, Log, TEXT("Key": %d Value: "%s"), Test.key, *Test.Value);
}

// OutPut:
key: 1 	Value: YangDong
key: 2 	Value: 杨东
key: 3 	Value: ZhangSan
key: 4 	Value: LiSi

4. 查-获取元素数量

? Num函数获取TMap保存的元素数量

int32 Count = TestMap.Num()

// Output
// Count = 4

5. 查-Key获取Value

? 与Array类似,通过key的索引获取对应Value

FString Val4 = TestMap[4];
/*
Val4 = "LiSi"
*/

// 对应KV不存在,则会触发断言
FString Val5 = TestMap[5] // 触发assert!

6. 查-判断key是否存在

? 使用 Contains 函数检查 TMap 中是否存在特定的键;

bool bHas2 = TestMap.Contains(2);
bool bHas6 = TestMap.Contains(6);

// bHas2 == True
// bHas6 == False
  • Contains 函数查找TMap是否存在某个key,会进行 两次查找
  • Find 函数只执行 一次查找, 返回的是指向元素的 指针, 若不存在则返回null
FString* Ptr7 = TestMap.Find(7);
FString* Ptr3 = TestMap.Find(3);

// *Ptr3 == "ZhangSan"
// Ptr7 == nullptr
  • FindOrAdd: 判断要 搜索的 是否存在, 存在返回Value;不存在以默认构造函数 添加 , 并返回Value的 引用
FString& Ref4 TestMap.Find(4);
// Ref4 == "LiSi"
/*
TestMap == [
    {key:1, Value:"YangDong"},
    {key:2, Value:"杨东"},
    {key:3, Value:"ZhangSan"},
    {key:4, Value:"LiSi"},
]
*/

FString& Ref7 TestMap.Find(7);
// Ref7 == ""
/*
TestMap == [
    {key:1, Value:"YangDong"},
    {key:2, Value:"杨东"},
    {key:3, Value:"ZhangSan"},
    {key:4, Value:"LiSi"},
    {key:7, Value:""},
]
*/

7. 查-Value获取Key

? FindKey 函数是 反向查找(根据"Value" 查找 "Key", 由于Value可能不唯一, 索引返回的Key 可能是任意一个对应的key)

const int32* KeyManager = TestMap.FindKey(TEXT("ZhangSan"));
const int32* NoExitKey = TestMap.FindKey(TEXT("NoExit"));

// KeyManager == 3
// NoExitKey == nullptr

8. 查-获取所有KV

? 分别获取 所有keys和values,类似Python字典的keys和values操作。

// 初始化创建 2个数组 用来分别保存 TestMap的所有keys和values
TArray<int32> TestKeys;
TArray<FString> TestValues;

// 分别给2个数组 添加1个元素
TestKeys.Add(9);
TestValues.Add("Temp")

// 获取所有keys和values,但是将上面添加的2个临时元素清空了
TestMap.GenerateKeyArray(TestKeys);
TestMap.GenerateValueArray(TestValues);
/*
TestKeys == [1, 2, 3, 4, 7]
TestValues == ["YangDong", "杨东", "ZhangSan", "LiSi", ""]
*/

9. 删-移除

? Remove

TestMap.Remove(7);
/*
删除前
TestMap == [
    {key:1, Value:"YangDong"},
    {key:2, Value:"杨东"},
    {key:3, Value:"ZhangSan"},
    {key:4, Value:"LiSi"},
    {key:7, Value:""},
]
*/

/*
删除后
TestMap == [
    {key:1, Value:"YangDong"},
    {key:2, Value:"杨东"},
    {key:3, Value:"ZhangSan"},
    {key:4, Value:"LiSi"},
]
*/

10. 删-移除并返回其值

? FindAndRemoveChecked 函数从TMap中 移除并返回对应Value; 如果Key不存在,触发断言。

FString Removed2 = TestMap.FindAndRemoveChecked(2);
FString Removed7 = TestMap.FindAndRemoveChecked(5);  // 执行assert
/*
删除前
TestMap == [
    {key:1, Value:"YangDong"},
    {key:2, Value:"杨东"},
    {key:3, Value:"ZhangSan"},
    {key:4, Value:"LiSi"},
]
*/

/*
删除后
TestMap == [
    {key:1, Value:"YangDong"},
    {key:3, Value:"ZhangSan"},
    {key:4, Value:"LiSi"},
]

Removed2 == “杨东”
*/

11. 删-清空

? Empty()方法, 与Array一样,使用Empty函数移除所有元素

TestMap.Empty()
/*
执行前
TestMap == [
    {key:1, Value:"YangDong"},
    {key:3, Value:"ZhangSan"},
    {key:4, Value:"LiSi"},
]
*/
    
/*
执行后
TestMap == []
*/

12. 参考

参考链接:https://blog.csdn.net/u011476173/article/details/98769865

posted @ 2020-10-13 11:55  yblackd  阅读(326)  评论(0编辑  收藏  举报