ネイティブの C++ では、std::vector / std::stack / std::queue などがコンテナとして用意されていますが、UEC++ ではそれらをひとまとめにしたような非常に強力なコンテナとして TArray が用意されています。
その他にも Blueprint に公開されているメジャー?なコンテナとして、TMap / TSet が用意されています。
C++ でも大体はこれらで事足りるのですが、場合によっては機能が足りなかったり実装が複雑になるケースもあります。
そういったケースに対応できるかもしれない(できないかもしれない)マイナーなコンテナを一部紹介します。
TQueue
先入れ先だしのコンテナ。
std::queue や C# の 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
優先度付きキュー。
KeyType と IndexType の型を指定して使います。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