辞書(キー、データ)のように機能する連想コンテナ(ハッシュテーブル)です。
データは順序付けられていません。
通常、Map よりもわずかに高速です。データはソートされずに保存されます。
使用するには、最初に MHashTemplate を使ってデータ型テンプレートを作成する必要があります。
MHashTemplate(key_type、data_type)
マクロオプション:
注意
key_type の ZSTRING と WSTRING との違いは、割り当てられるメモリ量が異なることです。
Zstring は 1バイト*文字数分、割り当てられます。
Wstring は 2バイト*文字数(Windowsの場合)、または4バイト*文字数(Linuxの場合)が割り当てられます。
HASH は、key_type の値に対して計算されるため、比較結果は同じになります。
WSTRING 文字列と ZSTRING 文字列では、内部の HASH キーは異なりますが、入力と比較を行う場合には、状況は同じになるのです。例えば:
ZSTRINGKEYの場合:
1)テーブルに QQQ キーを持つ行を追加し、計算したら HASH = 111 だったとします。
2)QQQ をキーとする行があるかどうかを確認するとき、チェックする前に、そのキーに対して HASH が計算され、それも 111 となるため、そのようなキーが存在することになります。
WSTRINGKEYの場合:
1)テーブルに QQQ をキーとする行を追加し、計算したら HASH = 222 となったとします。
2)QQQ をキーとする行があるかどうかを確認するとき、チェックする前に、キーに対して HASH が計算され、それも 222 になるため、そのキーがあることを確認できるのです。
このように、キーが内部的にどんな HASH を持っているかは問題ではなく、同じ文字列に対して、同じ HASH になることがポイントです。
重要:key_type と data_type は PTR を指定する必要はありません(自動的に追加されます)。
たとえば、 ANY PTR 型を保存する場合は、マクロでANY だけを指定します。
ANY PTR 以外の型の場合、ポインターからのデータが保持されます。ANY PTR の場合、ポインターのみが保管されます。
次に、THASHTABLE + key_type + data_typeで構成される型の名前を使って変数を作成します。
例:
テンプレート MHashTemplate(zstring、wtring)を作成する場合、型の名前は THASHTABLEzstringwstring になります。
テンプレートを作成した後、次のように変数宣言します:Dim pHash as THASHTABLEzstringwstring
実際の使用例:
example_1:
#include "HashTable.bi"
MHashTemplate(Zstring , Zstring)
Dim As THASHTABLEzstringzstring Ptr pTable = New THASHTABLEzstringzstring
?
For i As Long = 0 To 10
pTable->insert("Key" & i , "Value" & i)
Next
? "Items count="; pTable->Count()
?
For i As Long = 0 To 10
? *pTable->find("Key" & i)
Next
?
? "elete Key5"
pTable->deleteitem("Key5")
?
? "Items count="; pTable->Count()
?
For i As Long = 0 To 10
? *pTable->find("Key" & i)
Next
pTable->cleartable()
pTable->freetable()
Sleep
example_2:
#include "HashTable.bi"
MHashTemplate(Zstring , Any)
Dim As THASHTABLEzstringAny Ptr pTable = New THASHTABLEzstringAny
Dim As Long m(3) = {1,2,3,4}
' save in the table only pointers
For i As Long = 0 To 3
pTable->insert("Key" & i , @m(i))
Next
For i As Long = 0 To 3
Dim As Long Ptr p = pTable->find("Key" & i)
? *p
Next
pTable->cleartable()
pTable->freetable()
Sleep
example_3:
#include "HashTable.bi"
Type MYTYPE
As Zstring*10 zs
As Long i
End Type
MHashTemplate(Zstring , MYTYPE)
Dim As THASHTABLEzstringMYTYPE Ptr pTable = New THASHTABLEzstringMYTYPE
Scope
Dim As MYTYPE mp
mp.zs = "one"
mp.i = 10
pTable->insert("Key1" , @mp )
mp.zs = "two"
mp.i = 20
pTable->insert("Key2" , @mp )
End Scope
For i As Long = 1 To 2
Dim As MYTYPE Ptr p = pTable->find("Key" & i)
? p->zs
? p->i
Next
pTable->cleartable()
pTable->freetable()
sleep