ソート済みSetとMap

二分木によりキーをソートした状態で管理するset, tableのデータ構造です。C++のset, map, multiset, multimapと同等の機能をNimで使うために作りました。(Nimでの名称はset/tableだからSortedSet/SortedTableの方がいいか?) イテレータはNodeという名称で管理されていて、木のノードの参照がそのまま渡されます。

SortedSet

コンストラクタ

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()が返ります。

lower_bound

var it = a.lower_bound(x:T)

x以上の最初のイテレータを返します。

upper_bound

var it = a.upper_bound(x:T)

xより大きい最初のイテレータを返します。

SortedMultiSet

コンストラクタ

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()

ほかは大体同じ

SortedMap

コンストラクタ

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

挿入時には[]演算子も使えます。存在しない場合は新たにキーが追加されるのでご注意ください。

ほかは同じです。

SortedMultiMap

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つのイテレータの距離を取得できます。