set/multisetを使うには、set.hというヘッダファイルをインクルードする。
#include <cstl/set.h>
以下のマクロを用いてコードを展開する必要がある。
setの場合
/* インターフェイスを展開 */ #define CSTL_SET_INTERFACE(Name, Type) /* 実装を展開 */ #define CSTL_SET_IMPLEMENT(Name, Type, Compare)
multisetの場合
/* インターフェイスを展開 */ #define CSTL_MULTISET_INTERFACE(Name, Type) /* 実装を展開 */ #define CSTL_MULTISET_IMPLEMENT(Name, Type, Compare)
Nameに既存の型と重複しない任意の名前を、Typeに任意の要素の型を指定する。
Compareに要素の比較ルーチンを指定する。
Typeが整数型、小数型、ポインタ型など、2つの値を単純に比較できる型の場合、 要素のソートの順序を昇順にするならばCSTL_LESSマクロを、降順にするならばCSTL_GREATERマクロを指定する。 CSTL_LESS/CSTL_GREATERマクロはヘッダで以下のように定義されている。
#define CSTL_LESS(x, y) ((x) == (y) ? 0 : (x) < (y) ? -1 : 1) #define CSTL_GREATER(x, y) ((x) == (y) ? 0 : (x) > (y) ? -1 : 1)
Typeがその他の型の場合、以下のプロトタイプのような引数と戻り値を持ち、 x == yならば0を、x < yならば正または負の整数を、x > yならばx < yの場合と逆の符号の整数を 返す比較ルーチンを指定する。 尚、Typeが文字列型(char*)ならば、C標準関数のstrcmpが指定可能である。
int Compare(Type x, Type y);
CSTL_SET_INTERFACE/CSTL_MULTISET_INTERFACEの引数のNameにSet, TypeにTを指定した場合、 以下のインターフェイスを提供する。
Set
コンテナの型。抽象データ型となっており、以下の関数によってのみアクセスできる。
SetIterator
イテレータの型。要素の位置を示す。 関数から返されたイテレータを有効なイテレータという。 宣言されただけのイテレータ、または削除された要素のイテレータを無効なイテレータという。
以下の関数において、Set*型の引数はNULLでないことを事前条件に含める。
Set *Set_new(void);
void Set_delete(Set *self);
size_t Set_size(Set *self);
int Set_empty(Set *self);
SetIterator Set_begin(Set *self);
SetIterator Set_end(Set *self);
SetIterator Set_rbegin(Set *self);
SetIterator Set_rend(Set *self);
SetIterator Set_next(SetIterator pos);
SetIterator Set_prev(SetIterator pos);
T Set_key(SetIterator pos);
SetIterator Set_insert(Set *self, T elem, int *success);
SetIterator Set_insert(Set *self, T elem);
int Set_insert_range(Set *self, SetIterator first, SetIterator last);
SetIterator Set_erase(Set *self, SetIterator pos);
SetIterator Set_erase_range(Set *self, SetIterator first, SetIterator last);
size_t Set_erase_key(Set *self, T elem);
void Set_clear(Set *self);
void Set_swap(Set *self, Set *x);
size_t Set_count(Set *self, T elem);
SetIterator Set_find(Set *self, T elem);
SetIterator Set_lower_bound(Set *self, T elem);
SetIterator Set_upper_bound(Set *self, T elem);