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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM