map/multimapを使うには、map.hというヘッダファイルをインクルードする。
#include <cstl/map.h>
以下のマクロを用いてコードを展開する必要がある。
mapの場合
/* インターフェイスを展開 */ #define CSTL_MAP_INTERFACE(Name, KeyType, ValueType) /* 実装を展開 */ #define CSTL_MAP_IMPLEMENT(Name, KeyType, ValueType, Compare)
multimapの場合
/* インターフェイスを展開 */ #define CSTL_MULTIMAP_INTERFACE(Name, KeyType, ValueType) /* 実装を展開 */ #define CSTL_MULTIMAP_IMPLEMENT(Name, KeyType, ValueType, Compare)
Nameに既存の型と重複しない任意の名前を、KeyTypeに任意の要素のキーの型を、ValueTypeに任意の要素の値の型を指定する。
Compareに要素の比較ルーチンを指定する。
KeyTypeが整数型、小数型、ポインタ型など、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)
KeyTypeがその他の型の場合、以下のプロトタイプのような引数と戻り値を持ち、 x == yならば0を、x < yならば正または負の整数を、x > yならばx < yの場合と逆の符号の整数を 返す比較ルーチンを指定する。 尚、KeyTypeが文字列型(char*)ならば、C標準関数のstrcmpが指定可能である。
int Compare(KeyType x, KeyType y);
CSTL_MAP_INTERFACE/CSTL_MULTIMAP_INTERFACEの引数のNameにMap, KeyTypeにKeyT, ValueTypeにValueTを指定した場合、 以下のインターフェイスを提供する。
Map
コンテナの型。抽象データ型となっており、以下の関数によってのみアクセスできる。
MapIterator
イテレータの型。要素の位置を示す。 関数から返されたイテレータを有効なイテレータという。 宣言されただけのイテレータ、または削除された要素のイテレータを無効なイテレータという。
以下の関数において、Map*型の引数はNULLでないことを事前条件に含める。
Map *Map_new(void);
void Map_delete(Map *self);
size_t Map_size(Map *self);
int Map_empty(Map *self);
MapIterator Map_begin(Map *self);
MapIterator Map_end(Map *self);
MapIterator Map_rbegin(Map *self);
MapIterator Map_rend(Map *self);
MapIterator Map_next(MapIterator pos);
MapIterator Map_prev(MapIterator pos);
KeyT Map_key(MapIterator pos);
ValueT *Map_value(MapIterator pos);
ValueT *Map_lookup(Map *self, KeyT key);
MapIterator Map_insert(Map *self, KeyT key, ValueT value, int *success);
MapIterator Map_insert(Map *self, KeyT key, ValueT value);
int Map_insert_range(Map *self, MapIterator first, MapIterator last);
MapIterator Map_erase(Map *self, MapIterator pos);
MapIterator Map_erase_range(Map *self, MapIterator first, MapIterator last);
size_t Map_erase_key(Map *self, KeyT key);
void Map_clear(Map *self);
void Map_swap(Map *self, Map *x);
size_t Map_count(Map *self, KeyT key);
MapIterator Map_find(Map *self, KeyT key);
MapIterator Map_lower_bound(Map *self, KeyT key);
MapIterator Map_upper_bound(Map *self, KeyT key);