前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク : SophiaFramework 3.0

10.1. コレクション クラス

10.1.1. コレクション クラス

複数のオブジェクトをまとめて、配列のように管理したいとき、コレクション クラスを用います。

SophiaFramework のコレクション クラスは、可変長配列、スタック、リスト、ハッシュ マップの4種類があります。

SFXArray 配列により実装された可変長配列です。
SFXStack 配列により実装されたスタックです。
SFXList 双方向リンクリストにより実装されたリストです。
SFXHashmap ハッシュテーブルにより実装されたマップです。
[Caution] コレクション クラスの制限

コレクション クラスに格納できるオブジェクトは 4 バイト以下のものに限ります。

参照:4 バイトより大きなオブジェクトの扱い

10.1.2. 簡単な使用例:SFXArray

定義

// SInt32 を格納する可変長配列 (SFXArray) の定義
SFXArray<SInt32> array;

要素の追加

array.Append(3);
array.Append(-15);
array.Append(0);
array.Append(1003);

// array は (3, -15, 0, 1003) となる

要素の取得、設定

SInt32 n = array[1]; // n は -15 となる

array[2] = 6; // array は (3, -15, 6, 1003) となる

SInt32 m = array.GetFirst(); // m は 3 となる
SInt32 r = array.GetLast(); // r は 1003 となる

要素数の取得

SInt32 n = array.GetSize(); // n は 4 となる

要素の挿入

// 2 個目の要素の後ろに 99 を挿入
array.Insert(2, 99);  // array は (3, -15, 99, 6, 1003) となる

// 先頭に -100 を挿入
array.InsertFirst(-100); // array は (-100, 3, -15, 99, 6, 1003) となる

一部削除

// array[3] から array[4] までを削除 (array[5] までではない)
array.Remove(3, 5); // array は (-100, 3, -15, 1003) となる

全削除

array.Clear(); // array は空となる

サイズの伸長

array.SetSize(5); // array は (不定, 不定, 不定, 不定, 不定) となる

SInt32 i;
for (i = 0; i < array.GetSize(); ++i) {
    array[i] = 10 * (i - 2) * (i - 2);
}

//  array は (40, 10, 0, 10, 40) となる

検索・存在判定

SInt32 n1 = array.IndexOf(10);     // n1 は 1 となる
SInt32 n2 = array.IndexOf(5);      // n2 は -1 となる
SInt32 n3 = array.LastIndexOf(10); // n3 は 3 となる
Bool b = array.Contains(40);        // b は true となる

各要素に対する処理 (イテレータ)

SFXArray<SInt32>::Iterator iterator = array.GetIterator();
while(iterator.HasNext()) {
    SInt32 n = iterator.GetNext(); // n に要素が入る

    //... n に対して何らかの処理をする

}

上のコードは次と等価です。

SInt32 i;
for (i = 0; i < array.GetSize(); ++i) {
    SInt32 n = array[i]; // n に要素が入る

    //... n に対して何らかの処理をする

}

10.1.3. 簡単な使用例:SFXStack

スタック (SFXStack) は、SFXArray の機能にスタック固有の機能を追加したものです。

定義

// SInt32 を格納するスタック (SFXStack) の定義
SFXStack<SInt32> stack;

要素のプッシュ

stack.Push(3);
stack.Push(-15);
stack.Push(22);
// stack は (3, -15, 22) となる

末尾の要素の参照

SInt32 r = stack.Peek(); // r は 22 となる
// stack は (3, -15, 22) となる

要素のポップ

SInt32 n1 = stack.Pop(); // n1 は 22、stack は (3, -15) となる
SInt32 n2 = stack.Pop(); // n2 は -15、stack は (3) となる
SInt32 n3 = stack.Pop(); // n3 は 3、stack は空となる

その他の操作は SFXArray と同様にできます。

10.1.4. 簡単な使用例:SFXList

リスト (SFXList) は、各要素をポインタで結んだデータ構造です。一般に双方向リストと呼ばれているものです。

SFXArray との違いについては 各データ構造の性質 を参照してください。

定義

// SInt32 を格納するリスト (SFXList) の定義
SFXArray<SInt32> list;

要素の追加

list.Append(3);
list.Append(-15);
list.Append(0);
list.Append(1003);

// list は (3, -15, 0, 1003) となる

要素の取得、設定

// SInt32 n = array[1]; 不可

// array[2] = 6; 不可

SInt32 m = list.GetFirst(); // m は 3 となる
SInt32 r = list.GetLast(); // r は 1003 となる

要素数の取得

SInt32 n = list.GetSize(); // n は 4 となる

その他の操作は基本的には SFXArray と同じです。

10.1.5. 簡単な使用例:SFXHashmap

ハッシュ マップ (SFXHashmap) は、データの対をハッシュテーブルを用いて管理します。

定義

// SFXAnsiString と SInt32 の対を格納するハッシュ マップの定義
// SFXAnsiString と SFXWideString はハッシュ マップでは例外的に使用可能
SFXHashmap<SFXAnsiString, SInt32> hashmap;

要素の追加

hashmap.Set("abc", 7);
hashmap.Set("def", 15);

SFXAnsiString str("ghi");

hashmap.Set(str, 31);

要素の取得

SInt32 n = hashmap.Get("def"); // n は 15 となる

使用例:word counter

ある文字列の単語 (英数字) の出現回数をカウントします。

SFXAnsiString string("abc def def def ghi ghi"); // カウントしたい文字列

SFXHashmap<SFXAnsiString, SInt32> hashmap; // ハッシュ マップ

Bool alpha = false;
SInt32 c;

for (int i = 0; i < string.GetLength() + 1; ++i) {
    // string[i] が英数字であるかを判定。
    // i != string.GetLength() は末尾の処理
    if (i != string.GetLength() && SFXAscii::IsAlphaDigit(string[i])) {
        if (!alpha) {
            c = i;
            alpha = true;
        }
    } else {
        if (alpha) {
            SFXAnsiString word(string.Substring(c, i)); // word の切り出し
            if (hashmap.ContainsKey(word)) { // word が含まれるなら
                // これまでの出現回数を取得
                SInt32 count = hashmap.Get(word);
                ++count;
                hashmap.Set(word, count); // 再設定
            } else {
                // 初めて出現したので、回数を1回に設定
                hashmap.Set(word, 1);
            }
            alpha = false;
        }
    }
}

SInt32 n1 = hashmap.Get("def"); // n1 は 3 になる
SInt32 n2 = hashmap.Get("abc"); // n2 は 1 になる
SInt32 n3 = hashmap.Get("jkl"); // n3 は 0 になる