![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク : SophiaFramework 3.0 |
複数のオブジェクトをまとめて、配列のように管理したいとき、コレクション クラスを用います。
SophiaFramework のコレクション クラスは、可変長配列、スタック、リスト、ハッシュ マップの4種類があります。
| SFXArray | 配列により実装された可変長配列です。 |
| SFXStack | 配列により実装されたスタックです。 |
| SFXList | 双方向リンクリストにより実装されたリストです。 |
| SFXHashmap | ハッシュテーブルにより実装されたマップです。 |
![]() |
コレクション クラスの制限 |
|---|---|
|
コレクション クラスに格納できるオブジェクトは 4 バイト以下のものに限ります。 | |
定義
// 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 に対して何らかの処理をする
}
スタック (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 と同様にできます。
リスト (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 と同じです。
ハッシュ マップ (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 になる
|
Copyright (C) 2002 - 2009 Sophia Cradle, Inc. All Rights Reserved. |
![]() ![]() ![]()
|