• 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

  • 相关阅读:
    在IIS上搭建WebSocket服务器(一)
    ngnix 一 入门指南
    博客园的打赏功能
    Java基础(十)内部类
    Java虚拟机之垃圾回收详解一
    Servlet问题:servlet cannot be resolved to a type解决办法
    WIN7局域网文件共享设置方法
    基于tcp的socket通信
    java基础之抽象类的介绍
    Hdfs详解
  • 原文地址:https://www.cnblogs.com/yblackd/p/13801553.html
Copyright © 2020-2023  润新知