【UE5】マイナーなコンテナクラスについて

ネイティブの C++ では、std::vector / std::stack / std::queue などがコンテナとして用意されていますが、UEC++ ではそれらをひとまとめにしたような非常に強力なコンテナとして TArray が用意されています。

その他にも Blueprint に公開されているメジャー?なコンテナとして、TMap / TSet が用意されています。

C++ でも大体はこれらで事足りるのですが、場合によっては機能が足りなかったり実装が複雑になるケースもあります。
そういったケースに対応できるかもしれない(できないかもしれない)マイナーなコンテナを一部紹介します。


TQueue

先入れ先だしのコンテナ。
std::queueC#Queue ほど使い勝手はよくなく、要素数が取得できなかったりイテレータが使えないなど機能が限定的です。

関数名 概要
Empty キューを空にする
IsEmpty キューが空か判定
Enqueue キューの末尾にアイテムを追加
Dequeue キューの先頭からアイテムを取得して削除
Peek キューの先頭からアイテムを取得
Pop キューの先頭からアイテムを削除


・サンプルコード

TQueue<int32> queue;

queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);

int32 a = *q.Peek();	// 1

int32 c = 0;
q.Dequeue(c);		// 1

int32 d = 0;
q.Dequeue(d);		// 2




TSortedMap

ソート済み連想コンテナ。
TMap とほぼ同じインターフェイスを備えていて、要素数が少ない場合は TMap より高速で要素数が増えていくと TMap より効率が悪くなります。
キータイプによって自動で並べ替えられるので、手動で並べ替えることはできません。

・サンプルコード

TSortedMap<int32, FString> sortMap;

sortMap.Add(2, "hoge");	// {[2, hoge]}
sortMap.Add(0, "foo");	// {[0, foo], [2, hoge]}
sortMap.Add(1, "piyo");	// {[0, foo], [1, piyo], [2, hoge]}




TList

単方向リストのコンテナ。
要素を格納するリストが次のリストへのポインタを持っています。

プロパティ名 概要
Element 要素
Next 次のリストへのポインタ


・サンプルコード

TList<int32> listA = 1;
TList<int32> listB = 2;
listA.Next = &listB;

listA.Element;		// 1
listA.Next->Element;	// 2




TBitArray

ビット列コンテナ。

関数名 概要
Add ビットを追加
AddRange 指定されたBitArrayから複数のビットを追加
AddUninitialized 配列の最後にビット用のスペースを追加 ※ 0が追加される
RemoveAt ビットを削除
RemoveAtSwap ビットを削除し、削除されたインデックスに配列の最後のビットを移動
Insert 指定したインデックスにビットを挿入
Init 配列の初期化
Empty 全てのビットの削除
Reserve 指定されたビット数分のメモリを確保
BitwiseAND 2つのBitArrayからのAND判定
BitwiseOR 2つのBitArrayからのOR判定
BitwiseXOR 2つのBitArrayからのXOR判定
BitwiseNOT すべてのビットに対してNOTを実行
Find 配列内の最初の true/false ビットを検索し、ビットインデックスを返す
FindLast 配列内の最後の true/false ビットを検索し、ビットインデックスを返す


・サンプルコード

TBitArray<> flagsA(false, 2);			// {0, 0}
flagsA.Add(true);				// {0, 0, 1}
flagsA.Add(false, 2);				// {0, 0, 1, 0, 0}
flagsA.RemoveAt(1);				// {0, 1, 0, 0}
flagsA.Insert(true, 3);				// {0, 1, 0, 1, 0}

TBitArray<> flagsB;				// {}
flagsB.AddRange(flagsA, 3);			// {0, 1, 0}
flagsB.AddUninitialized(2);			// {0, 1, 0, 0, 0}

TBitArray<> flagsAND = TBitArray<>::BitwiseAND(flagsA, flagsB, EBitwiseOperatorFlags::MinSize);	// {0, 1, 0, 0, 0}
TBitArray<> flagsOR  = TBitArray<>::BitwiseOR (flagsA, flagsB, EBitwiseOperatorFlags::MinSize);	// {0, 1, 0, 1, 0}
TBitArray<> flagsXOR = TBitArray<>::BitwiseXOR(flagsA, flagsB, EBitwiseOperatorFlags::MinSize);	// {0, 0, 0, 1, 0}

flagsB.BitwiseNOT();				// {1, 0, 1, 1, 1}
flagsB.Add(false);				// {1, 0, 1, 1, 1, 0}
flagsB.RemoveAtSwap(2);				// {1, 0, 0, 1, 1}

int32 a = flagsB.Find(false);			// 1
int32 b = flagsB.FindLast(false);		// 2

flagsB.Init(true, 2);				// {1, 1}
flagsB.Empty();					// {}




TTuple

複数の型を1つにまとめられるコンテナ。
型が2つの場合は、std::pair のように Key / Value が扱えます。

変数名 概要
Key 1つ目の要素を取得
Value 2つ目の要素を取得
関数名 概要
Get<> n番目の要素を取得


・サンプルコード

TTuple<int32, float> tupleA(123, 0.5f);
int32 a = tupleA.Key;		// 123
float b = tupleA.Value;		// 0.5


TTuple<int32, float, FString> tupleB(123, 0.5f, "hoge");
int32   c = tupleB.Get<0>();	// 123
float   d = tupleB.Get<1>();	// 0.5
FString e = tupleB.Get<2>();	// "hoge"




FBinaryHeap

優先度付きキュー。
KeyTypeIndexType の型を指定して使います。IndexType はデフォルトの型が uint32 になっています。

関数名 概要
Add 要素の追加
Remove 要素の削除
Pop 先頭の要素の削除
Top 先頭の要素の取得
Num 素数の取得
GetKey キーの取得
IsEmpty キューが空か判定
IsPresent 指定したインデックスの要素が存在するか判定
Clear キューを空にする


・サンプルコード

#include "Containers/BinaryHeap.h"

FBinaryHeap<FString> binHeap;

binHeap.Add("hoge", 3);
binHeap.Add("foo",  1);
binHeap.Add("piyo", 2);

FString keyA = binHeap.GetKey(2);		// "piyo"
FString keyB = binHeap.GetKey(10);		// ""

bool isPresentA = binHeap.IsPresent(2);		// true
bool isPresentB = binHeap.IsPresent(10);	// false

int32 top = binHeap.Top();			// 1
int32 num = binHeap.Num();			// 3




TArrayView

既存の配列を参照して TArray と同等のインターフェイスが用意されている固定長のコンテナ。


・サンプルコード

#include "Algo/Accumulate.h"

void AMyActor::TestFunc()
{
	TArray<int32> refArray = {1, 20, 300, 4000, 50000};
	TArrayView<int32> view = refArray;
	
	int32 num = view.Num();		// 5
	int32 sum = SumAll(view);	// 54321
}

int32 AMyActor::SumAll(TArrayView<const int32> array)
{
	return Algo::Accumulate(array, 0);
}



今回紹介したのは一部ですが、他にも主に以下フォルダ下にコンテナ系のクラスがまとまっています。
\Engine\Source\Runtime\Core\Public\Containers


UE Version : 5.0.0-19044958