ハッシュ・テーブル(連想配列)

前 次

辞書(キー、データ)のように機能する連想コンテナ(ハッシュテーブル)です。
データは順序付けられていません。
通常、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_typedata_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


参照: