![]() ![]() ![]()
|
SophiaFramework 2.0 |
SFUList は単方向リストを表す抽象クラスで、 具象クラスで定義すべきインターフェイスを定義しています。
表 5.2. SFUList の抽象仮想関数
| Append | 要素を追加します。 |
| ElementAt | 要素を取得/設定します。 |
| GetIterator | イテレータを取得します。 |
| IndexOf | 要素を先頭から検索します。 |
| LastIndexOf | 要素を末尾から検索します。 |
| Insert | 要素を挿入します。 |
| Replace | 要素を置換します。 |
| Remove | 要素を削除します。 |
SFULinkedList は SFUList を継承した具象クラスで、 単方向リンクリストを実装しています。
SFUWList は SFUList を継承した抽象クラスで、 双方向リストのためのインターフェイスを定義します。
双方向リストの具象クラスとしては、 配列リスト SFUArrayList と双方向リンクリスト SFUWList が用意されています。
次の例では、配列リストとイテレータの使い方を示しています。
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() 関数により判定できます。
コレクションに登録されたポインタは、 コレクション オブジェクトが破棄されても解放されるわけではありません。 そのため、登録したヒープ ポインタを明示的に解放する必要があります。 これを行わないとメモリ リークが発生しますので注意してください。
| Copyright(C) 2003 Sophia Cradle Inc., All Rights Reserved. |
![]() ![]() ![]()
|