学んだこと、試したこと、気づいたことをまとめています。
はじめに
Key(キー)とValue(値)で管理するデータ構造。
👇なじみのない人はこちら。
KeyとValueのペアの配列
特徴
・検索しやすい
・Keyは重複できない
👇参照動画
FName, FText, FString
記述の型
TMap<Keyの型, Valueの型> マップ名;
例
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyActor")
TMap<FName, float> Map;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyActor")
TMap<FName, float> Map2;
面積(平方km)
基本操作
記述の型マップを書き換える
マップ.Add(Key, Value);
マップに要素を追加する。
MyActor.h
UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
void MapAdd(UPARAM(ref) TMap<FName, float>& InMap, FName InName, float InFloat);
MyActor.cpp
void AMyActor::MapAdd(TMap<FName, float>& InMap, FName InName, float InFloat)
{
InMap.Add(InName, InFloat);
}
記述の型マップを書き換える
マップ.Append(マップ);
はじめのマップを書き換えて、括弧の中のマップを追加する。
MyActor.h
UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
void MapAppend(UPARAM(ref) TMap<FName, float>& InMap, TMap<FName, float> AppendMap);
MyActor.cpp
void AMyActor::MapAppend(TMap<FName, float>& InMap, TMap<FName, float> AppendMap)
{
InMap.Append(AppendMap);
}
記述の型整数値を返す
マップ.Num()
マップの要素数を返す。
MyActor.h
UFUNCTION(BlueprintPure, Category = "Actor Functions")
int32 MapLength(UPARAM(ref) TMap<FName, float>& InMap);
MyActor.cpp
int32 AMyActor::MapLength(TMap<FName, float>& InMap)
{
return InMap.Num();
}
記述の型Valueを返す
マップ[Key]
キーの値を返す。Findとの違いはあまりよく分かっていない。
MyActor.h
UFUNCTION(BlueprintPure, Category = "Actor Functions")
float MapGet(UPARAM(ref) TMap<FName, float>& InMap, FName InName);
MyActor.cpp
float AMyActor::MapGet(TMap<FName, float>& InMap, FName InName)
{
return InMap[InName];
}
マップからKeyを抜き出した配列をつくる。
記述の型配列を書き換える。
マップ.GetKeys(配列);
マップのキーを配列に代入。たぶん。GenerateKeyArrayでも同じかも。
MyActor.h
UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
TArray<FName> MapKeys(UPARAM(ref) TMap<FName, float>& InMap);
MyActor.cpp
TArray<FName> AMyActor::MapKeys(TMap<FName, float>& InMap)
{
TArray<FName> MapKeys;
InMap.GetKeys(MapKeys);
return MapKeys;
}
マップからValueを抜き出した配列をつくる。
記述の型配列を書き換える。
マップ.GenerateValueArray(配列);
マップのValueを配列に代入。おそらく。
MyActor.h
UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
TArray<float> MapValues(UPARAM(ref) TMap<FName, float>& InMap);
MyActor.cpp
TArray<float> AMyActor::MapValues(TMap<FName, float>& InMap)
{
TArray<float> MapValues;
InMap.GenerateValueArray(MapValues);
return MapValues;
}
記述の型ブール値を返す
マップ.Contains(Key)
キーがあればtrue、なければfalseを返す。
MyActor.h
UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
bool MapContains(UPARAM(ref) TMap<FName, float>& InMap, FName InName);
MyActor.cpp
bool AMyActor::MapContains(TMap<FName, float>& InMap, FName InName)
{
if (InMap.Contains(InName))
{
return true;
}
else
{
return false;
}
}
記述の型値を返す
マップ.Find(Key)
Keyに対応したValue(ポインタ)を返す。Getを使うべきところでFindを使ってみたらエラーがでた。Findはポインタ変数に突っ込むときに使うものだと認識しておく。
(cannot convert from ‘ValueType *’ to ‘float’)
MyActor.h
UFUNCTION(BlueprintPure, Category = "Actor Functions")
bool MapFind(UPARAM(ref) TMap<FName, float>& InMap, FName InName, float& Value);
MyActor.cpp
bool AMyActor::MapFind(TMap<FName, float>& InMap, FName InName, float& Value)
{
const float* ValPtr = InMap.Find(InName);
if (ValPtr)
{
Value = *ValPtr;
return true;
}
else
{
Value = 0.0;
return false;
}
}
ポインタを使っているから、if文の中で使えるのかも。nullptrでなければtrueなのかな。
記述の型マップを書き換える
マップ.Remove(Key);
マップから指定したキーの要素を取り除く。
MyActor.h
UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
bool MapRemove(UPARAM(ref) TMap<FName, float>& InMap, FName InName);
MyActor.cpp
bool AMyActor::MapRemove(TMap<FName, float>& InMap, FName InName)
{
if (InMap.Contains(InName))
{
InMap.Remove(InName);
return true;
}
else
{
return false;
}
}
記述の型マップを書き換える。
マップ.Empty();
マップから全ての要素を取り除く。
MyActor.h
UFUNCTION(BlueprintCallable, Category = "Actor Functions", meta = (HideSelfPin = "true"))
void MapClear(UPARAM(ref) TMap<FName, float>& InMap);
MyActor.cpp
void AMyActor::MapClear(TMap<FName, float>& InMap)
{
InMap.Empty();
}
イテレーション
MyActor.h
UFUNCTION(BlueprintPure, Category = "Actor Functions")
float MapSum(UPARAM(ref) TMap<FName, float>& InMap);
MyActor.cpp
float AMyActor::MapSum(TMap<FName, float>& InMap)
{
float Sum = 0.0;
TArray<FName> Keys;
InMap.GetKeys(Keys);
int Num = Keys.Num();
for(int32 i = 0; i < Num; i++)
{
FName Key = Keys[i];
Sum += InMap[Key];
}
return Sum;
}
MyActor.h
UFUNCTION(BlueprintPure, Category = "Actor Functions")
float MapSum2(UPARAM(ref) TMap<FName, float>& InMap);
MyActor.cpp
float AMyActor::MapSum2(TMap<FName, float>& InMap)
{
float Sum = 0.0;
for (const TPair<FName, float>& Pair : InMap)
{
Sum += Pair.Value;
}
return Sum;
}
MyActor.h
UFUNCTION(BlueprintPure, Category = "Actor Functions")
float MapSum3(UPARAM(ref) TMap<FName, float>& InMap);
MyActor.cpp
float AMyActor::MapSum3(TMap<FName, float>& InMap)
{
float Sum = 0.0;
for (auto It = InMap.CreateIterator(); It; ++It)
{
Sum += It.Value();
}
return Sum;
}
その他
👇ポインタの理解に役に立ちそうなコード。
TMap<int32, AMyActor*> MyActorMap;
AMyActor** MyActorPtr = AMyActorMap.Find(Key);
AMyActor* MyActor = *MyActorPtr;
OR
AMyActor* MyActor = *AMyActorMap.Find(Key);
if(MyActor)
{
MyActor->MyFunc();
}
Findは、値にポインタを返す。
少しだけ分かってきた気がする。
AMyActor*などは、もともとポインタクラス。
👇参考動画
Twitterしてます
ブログの更新をお知らせ
コメント