二分木によりキーをソートした状態で管理するset, tableのデータ構造です。C++のset, map, multiset, multimapと同等の機能をNimで使うために作りました。(Nimでの名称はset/tableだからSortedSet/SortedTableの方がいいか?) イテレータはNodeという名称で管理されていて、木のノードの参照がそのまま渡されます。
var a = initSortedSet(T, countable:static[bool]=false, comp:proc(a, b:T):bool=nil)
var a:SortedSet(T,countable=false,comp:proc(a,b:T):bool=nil); a.init()
a.begin()
先頭の要素のNode(iterator)を取得します。
a.end()
末尾の要素のNode(iterator)を取得します。C++同様、このend()ノードには値は入っていないのでご注意ください。endが予約後になってて実装にちょっと苦労しました。
var it = a.insert(x)
var it = a.incl(x)
var it = a.erase(x:T)
var it = a.excl(x:T)
var it = a.erase(it0)
var it = a.erase(it0)
var it = a.find(x:T)
要素xを検索してイテレータを返します。存在しない場合はa.end()が返ります。
var it = a.lower_bound(x:T)
x以上の最初のイテレータを返します。
var it = a.upper_bound(x:T)
xより大きい最初のイテレータを返します。
var a = initSortedMultiSet(T, countable:static[bool]=false, comp:proc(a, b:T):bool=nil)
var a:SortedMultiSet(T,countable=false,comp:proc(a,b:T):bool=nil); a.init()
ほかは大体同じ
var a = initSortedMap(K, V, countable:static[bool]=false, comp:proc(a, b:T):bool=nil)
var a:SortedMap(K, V,countable=false,comp:proc(a,b:T):bool=nil); a.init()
Kにキー、Vにバリューを指定します。他の引数は同上です。
var it = a.insert((key:K, value:V))
var it = a.incl((key:K, value:V))
a[key:T] = value:V
挿入時には[]演算子も使えます。存在しない場合は新たにキーが追加されるのでご注意ください。
ほかは同じです。
var a = initSortedMultiMap(K, V, countable:static[bool]=false, comp:proc(a, b:T):bool=nil)
var a:SortedMultiMap(K, V,countable=false,comp:proc(a,b:T):bool=nil); a.init()
var p = *it
C++と同様、イテレータのアスタリスクで要素の取得が可能です。setの場合は要素自身、mapの場合はキーとバリューのペアになります。
it.inc
it.dec
var it2 = it.succ
var it2 = it.pred
it += n
it -= n
ノード(iterator)はinc, dec関数でインクリメント可能です。end()ノードのインクリメント、begin()ノードのデクリメントは未定義動作です。succ, predでそれぞれ次の要素、前の要素を取得できます。
下記の処理はコンストラクト時にcountableをtrueにしている必要があります。falseになっているとこの機能は使えませんが余計な処理がない分少し早いかもしれません。
var it = a.kth_element(k:int)
var it = a{k:int}
上記の操作でk番目の要素のイテレータを取り出すことが可能です。
var k = it.index
イテレータの現在のインデックスを取得できます。
var d = distance(it, it2)
C++同様, 2つのイテレータの距離を取得できます。