- UE4-容器-数据结构-TMap
- Time: 2020年10月13日16:31:22
- author: Yblackd
UE4-容器-数据结构-TMap
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 == []
*/