C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

UE4: std::unordered_map だと少し面倒だけど TMap なら簡単にできる Key の書き換え

// てきとーな TMap
TMap< FString, int32 > m;
m.Add( "hoge", 123 );
m.Add( "fuga", 234 );
m.Add( "piyo", 345 );

// マップの対を逐次参照で列挙しつつ Key を書き換える
for ( auto& p : m )
  p.Key = 
    p.Key
      .Replace( TEXT( "g" ), TEXT( "G" ) )
      .Replace( TEXT( "o" ), TEXT( "O" ) )
    ;

// 結果発表・w・
for ( const auto& p : m )
  UE_LOG( LogTemp, Log, TEXT( "[%s]=>%d" ), *p.Key, p.Value );

結果:

[2018.03.20-06.14.36:153][  0]LogTemp: [hOGe]=123
[2018.03.20-06.14.36:153][  0]LogTemp: [fuGa]=234
[2018.03.20-06.14.36:153][  0]LogTemp: [piyO]=345

方便として UE4 入門時には TMap<K,V>std::unordered_map<K,V> "的"なものと捉えて扱い始めると既に std 系を習得済みの C++er が UE4/C++ へ入門する際には取っ付き易さがあります。表向きの Key-Value ストアーとしての挙動だけ見ると同様ですが、内部実装は大きく異なり、 TMap<K,V> では要素の参照をイテレーション中に Key を簡単に書き換えできて用途によっては便利、という小話。

ちなみに、 std::unorered_map<K,V> でキーを書き換えたいとなると少し面倒で実行コストも単なる値の書き換えより大きくなるので、そういう用途が必要な場合は std::vector< std::pair<K,V> > を使えば簡単かもしれない。 TMap<K,V> の内部実装は実際のところ、std::unordered_map よりも std::vector< std::pair<K,V> > に近い。