コンテナ

スタックやキューなど、いくつかのデータ構造を実現する方法についてまとめます。
Examples: スタックを構成する例です。
スタックは、後入れ先出し(LIFO: Last In, First Out)のデータ構造です。 要素の追加順に対し、後から追加した最も新しい要素が取り出されます。
汎用データ構造である std.containerSList を利用して実現します。 SListは「単方向リンクリスト(Single Linked List)」であり、先頭要素の追加や削除が高速(定数時間)です。 これはスタックの動作に沿っており、パフォーマンスの面からも優れています。
See_Also: https://dlang.org/phobos/std_container_slist.html
import std.container : SList;

SList!int stack;

// insertで要素を追加します。これは一般にpushとも呼ばれます。
// これらのメソッドはコンテナ共通インターフェースの一部で、SListではすべて先頭に要素を追加する操作になります
stack.insert(1);               // 1
stack.insertFront(2);          // 2 -> 1
stack.stableInsert(3);         // 3 -> 2 -> 1
stack.stableInsertFront(4);    // 4 -> 3 -> 2 -> 1

// スライス演算で全体をレンジとして取得し、中身を確認します。
// レンジは要素のシーケンスを表し、equal関数で比較できます。
import std.algorithm : equal;

assert(equal(stack[], [4, 3, 2, 1]));

// 先頭要素を取り除かずに確認します
assert(stack.front == 4);

// removeAnyで要素を取り除きます。これは一般にpopとも呼ばれ、先頭要素を取り除く操作になります。
// これらのメソッドもコンテナ共通インターフェースの一部で、SListではすべて先頭要素を取り除く操作になります
auto elem_4 = stack.removeAny();        // 4が取り除かれる: 3 -> 2 -> 1
auto elem_3 = stack.stableRemoveAny();  // 3が取り除かれる: 2 -> 1
assert(elem_4 == 4);
assert(elem_3 == 3);

// 要素をクリアします
stack.clear();
assert(stack.empty);
Examples: キューを構成する例です
キューは、先入れ先出し(FIFO: First In, First Out)のデータ構造です。 要素の追加順に対し、最初に追加した最も古い要素が取り出されます。
汎用データ構造である std.containerDList を利用して実現します。 DListは「双方向リンクリスト(Double Linked List)」であり、先頭と末尾に対する追加や削除が高速(定数時間)です。 これはキューの動作に沿っており、パフォーマンスの面からも優れています。
See_Also: https://dlang.org/phobos/std_container_dlist.html
import std.container : DList;

DList!int queue;

// insertで要素を追加します。これは一般にenqueueとも呼ばれます。
// これらのメソッドはコンテナ共通インターフェースの一部で、DListではすべて先頭に要素を追加する操作になります
queue.insertFront(1);          // 1
queue.stableInsertFront(2);    // 2 -> 1

// removeAnyで要素を取得します。これは一般にdequeueとも呼ばれ、後ろの要素を取り出す操作になります
// コンテナ共通インターフェースが利用でき、DListではすべて同じ意味になります
int elem_1 = queue.removeAny();          // 2
int elem_2 = queue.stableRemoveAny();    // empty
assert(elem_1 == 1);
assert(elem_2 == 2);

// スライス演算で全体をレンジとして取得し、中身を確認します。
queue.insertFront(10);    // 10
queue.insertFront(20);    // 20 -> 10
queue.insertFront(30);    // 30 -> 20 -> 10
queue.insertFront(40);    // 40 -> 30 -> 20 -> 10

// レンジは要素のシーケンスを表し、equal関数で比較できます。
import std.algorithm : equal;

assert(equal(queue[], [40, 30, 20, 10]));

// 先頭要素を取り除かずに確認します
assert(queue.back == 10);
// 最後に追加した要素を確認します
assert(queue.front == 40);

// removeAnyで要素を取り除きます。末尾要素を取り除く操作になります。
// これらのメソッドもコンテナ共通インターフェースの一部で、DListではすべて先頭要素を取り除く操作になります
auto elem_10 = queue.removeAny();          // 10が取り除かれる: 40 -> 30 -> 20
auto elem_20 = queue.stableRemoveAny();    // 20が取り除かれる: 40 -> 30
assert(elem_10 == 10);
assert(elem_20 == 20);

// 要素をクリアします
queue.clear();
assert(queue.empty);