在 TArray 之后,虚幻引擎中最常用的容器是 TMap。
此容器是一个关联式容器,意味着每个键均拥有一个关联值,可通过键高效地查找值对象。
存在两种映射类型:TMap 和 TMultiMap。TMap 的键为唯一。
键已存在时插入一个新的键值对将导致现有的对被替代。
TMultiMap 的键不为唯一,因此新添加的对不会替代现有的对。
("键值"指的是在一个映射或字典数据结构中,键(key)和它所对应的值(value)的组合。键用于唯一标识一个条目,而值则是与该键相关联的数据。例如,在一个用户信息的映射中,用户名可以作为键,而用户的详细信息(如邮箱、年龄等)则是值)jianzhi
-
TMap 也是值类型,支持通常的复制、赋值和析构函数运算,以及它的元素的强所有权。在映射被销毁时,它的元素都会被销毁。键和值也必须为值类型。
-
TMap 是散列容器,这意味着键类型必须支持 GetTypeHash 函数,并提供 运算符== 来比较各个键是否等值
-
TMap 也可使用任选分配器来控制内存分配行为。但不同于 TArray,这些是集合分配器,而不是 FHeapAllocator 和 TInlineAllocator 之类的标准UE4分配器。集合分配器(
TSetAllocator
类)定义映射应使用的散列桶数量,以及应使用哪个标准UE4分配器来存储散列和元素。
创建并填充映射
TMap<int32, FString> FruitMap; //空TMap,此时尚未分配内存
添加元素
Add
- 元素按插入顺序排列,但不保证这些元素在内存中实际保留此排序
- 各个键都必定是唯一。如果尝试添加重复键,将替换原来的键值
- Add 函数可接受不带值的键。调用此重载后的 Add 时,值将被默认构建
FruitMap.Add(5, TEXT("Banana")); FruitMap.Add(2, TEXT("Grapefruit")); FruitMap.Add(7, TEXT("Pineapple")); // FruitMap == [ // { Key:5, Value:"Banana" }, // { Key:2, Value:"Grapefruit" }, // { Key:7, Value:"Pineapple" } // ]
Emplace
-
可以代替 Add,防止插入映射时创建临时文件
-
FruitMap.Emplace(3, TEXT("Orange"));
Append
-
函数合并映射,将一个映射的所有元素移至另一个映射,源映射的相同键会替代目标映射中的键
TMap<int32, FString> FruitMap2;
FruitMap2.Emplace(4, TEXT("Kiwi"));
FruitMap2.Emplace(9, TEXT("Melon"));
FruitMap2.Emplace(5, TEXT("Mango"));
FruitMap.Append(FruitMap2);
// FruitMap == [
// { Key:5, Value:"Mango" },
// { Key:2, Value:"Pear" },
// { Key:7, Value:"Pineapple" },
// { Key:4, Value:"Kiwi" },
// { Key:3, Value:"Orange" },
// { Key:9, Value:"Melon" }
// ]
// FruitMap2 is now empty.
迭代
范围 - for
for (auto& Elem :FruitMap)
{
FPlatformMisc::LocalPrint( *FString::Printf(TEXT("(%d, \"%s\")\n"), Elem.Key, *Elem.Value) );
}
// Output:
// (5, "Mango")
// (2, "Pear")
// (7, "Pineapple")
// (4, "Kiwi")
// (3, "Orange")
// (9, "Melon")
迭代器
- CreateIterator 返回拥有读写访问权限的迭代器,
- CreateConstIterator 返回拥有只读访问权限的迭代器
for (auto It = FruitMap.CreateConstIterator(); It; ++It)
{
FPlatformMisc::LocalPrint(
*FString::Printf( TEXT("(%d, \"%s\")\n"),
It.Key(), // same as It->Key
*It.Value() // same as *It->Value
) );
}