前のページ次のページ上に戻るホーム SophiaFramework 2.1

5.3. リスト

5.3.1. 単方向リスト

図 5.3. リスト クラス

リスト クラス

SFUList は単方向リストを表す抽象クラスで、 具象クラスで定義すべきインターフェイスを定義しています。

表 5.2. SFUList の抽象仮想関数

Append 要素を追加します。
ElementAt 要素を取得/設定します。
GetIterator イテレータを取得します。
IndexOf 要素を先頭から検索します。
LastIndexOf 要素を末尾から検索します。
Insert 要素を挿入します。
Replace 要素を置換します。
Remove 要素を削除します。

SFULinkedListSFUList を継承した具象クラスで、 単方向リンクリストを実装しています。

5.3.2. 双方向リスト

SFUWList は SFUList を継承した抽象クラスで、 双方向リストのためのインターフェイスを定義します。

表 5.3. SFUWList の抽象仮想関数

GetWIterator 双方向イテレータを取得します。
GetLastWIterator 開始位置が末尾にある双方向イテレータを取得します。

双方向リストの具象クラスとしては、 配列リスト SFUArrayList と双方向リンクリスト SFUWList が用意されています。

5.3.3. リストの使用例

次の例では、配列リストとイテレータの使い方を示しています。

struct MyData {
    SIntN       id;
    ACharPtr    name;
    MyData(SIntN id, ACharPtr name) : id(id), name(name) {}
};

// 配列リストを構築
SFUArrayList ar(10);

MyData* pData;
pData = new MyData(1, "Yamada");
ar.Append(pData);
pData = new MyData(2, "Suzuki");
ar.Append(pData);
pData = new MyData(3, "Satou");
ar.Append(pData);

// 配列リストの要素の列挙
TRACE("Array count = %d", ar.GetSize());
SFUConstIterator it = ar.GetIterator();
for ( ; ! it.End(); it++) {
    pData = (MyData*) it.Get();
    TRACE("id = %d, name = %s", pData->id, pData->name);
}

// 配列リスト内のデータの解放
it = ar.GetIterator();
for ( ; ! it.End(); it++) {
    pData = (MyData*) it.Get();
    delete pData;
}

まず、SFUArrayList のコンストラクタで要素数 10 を指定することで、 あらかじめ要素数 10 個の容量を確保しています。 容量はそのコレクションが格納している実際の要素数とは異なります。 配列リストで容量を指定すると、 メモリ再割り当てに伴う負荷を軽減することができます。

次に、実際のデータをヒープに作成して、コレクションに登録しています。 コレクションに登録できる要素はポインタだけです。

コレクション内の要素を列挙するには、イテレータを使います。 GetIterator によってイテレータを取得した後、 ++ 演算子で進めながら次々に要素を取得しています。 イテレータが列挙を完了したかどうかは、 End() 関数により判定できます。

コレクションに登録されたポインタは、 コレクション オブジェクトが破棄されても解放されるわけではありません。 そのため、登録したヒープ ポインタを明示的に解放する必要があります。 これを行わないとメモリ リークが発生しますので注意してください。