マクロ定義 | |
#define | CSTL_SET_INTERFACE(Name, Type) |
set用インターフェイスマクロ | |
#define | CSTL_SET_IMPLEMENT(Name, Type, Compare) |
set用実装マクロ | |
#define | CSTL_MULTISET_INTERFACE(Name, Type) |
multiset用インターフェイスマクロ | |
#define | CSTL_MULTISET_IMPLEMENT(Name, Type, Compare) |
multiset用実装マクロ | |
#define | CSTL_LESS(x, y) ((x) == (y) ? 0 : (x) < (y) ? -1 : 1) |
昇順指定 | |
#define | CSTL_GREATER(x, y) ((x) == (y) ? 0 : (x) > (y) ? -1 : 1) |
降順指定 | |
型定義 | |
typedef struct Set | Set |
set/multisetの型 | |
typedef struct SetRBTree * | SetIterator |
イテレータの型 | |
関数 | |
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 const * | Set_data (SetIterator pos) |
イテレータによる要素のアクセス | |
SetIterator | Set_insert (Set *self, T data, int *success) |
要素を挿入(set専用) | |
SetIterator | Set_insert (Set *self, T data) |
要素を挿入(multiset専用) | |
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 data) |
指定した値の要素を削除 | |
void | Set_clear (Set *self) |
全要素を削除 | |
void | Set_swap (Set *self, Set *x) |
交換 | |
size_t | Set_count (Set *self, T data) |
指定した値の要素をカウント | |
SetIterator | Set_find (Set *self, T data) |
指定した値の要素を検索 | |
SetIterator | Set_lower_bound (Set *self, T data) |
最初の位置の検索 | |
SetIterator | Set_upper_bound (Set *self, T data) |
最後の位置の検索 |
multisetは要素の重複が許されることを除き、setと同じである。
set/multisetを使うには、<cstl/set.h>をインクルードし、以下のマクロを用いてコードを展開する必要がある。
#include <cstl/set.h> #define CSTL_SET_INTERFACE(Name, Type) #define CSTL_SET_IMPLEMENT(Name, Type, Compare) #define CSTL_MULTISET_INTERFACE(Name, Type) #define CSTL_MULTISET_IMPLEMENT(Name, Type, Compare)
CSTL_SET_INTERFACE() は任意の名前と要素の型のsetのインターフェイスを展開する。 CSTL_SET_IMPLEMENT() はその実装を展開する。
CSTL_MULTISET_INTERFACE() は任意の名前と要素の型のmultisetのインターフェイスを展開する。 CSTL_MULTISET_IMPLEMENT() はその実装を展開する。
#include <stdio.h> #include <cstl/set.h> CSTL_SET_INTERFACE(IntSet, int) /* インターフェイスを展開 */ CSTL_SET_IMPLEMENT(IntSet, int, CSTL_LESS) /* 実装を展開 */ int main(void) { int i; /* イテレータ */ IntSetIterator pos; /* intのsetを生成。 * 型名・関数のプレフィックスはIntSetとなる。 */ IntSet *set = IntSet_new(); /* 要素を挿入 */ for (i = 0; i < 64; i++) { IntSet_insert(set, i, NULL); } /* 要素数 */ printf("size: %d\n", IntSet_size(set)); for (pos = IntSet_begin(set); pos != IntSet_end(set); pos = IntSet_next(pos)) { /* イテレータによる要素の読み出し(書き換えはできない) */ printf("%d, ", *IntSet_data(pos)); } printf("\n"); /* 3以上の要素を削除 */ IntSet_erase_range(set, IntSet_find(set, 3), IntSet_end(set)); for (pos = IntSet_begin(set); pos != IntSet_end(set); pos = IntSet_next(pos)) { /* イテレータによる要素の読み出し(書き換えはできない) */ printf("%d, ", *IntSet_data(pos)); } printf("\n"); /* 使い終わったら破棄 */ IntSet_delete(set); return 0; }
また、set専用/multiset専用と記した関数以外の関数は、set/multiset共通の関数である。
#define CSTL_SET_INTERFACE | ( | Name, | |||
Type | ) |
set用インターフェイスマクロ
任意の名前と要素の型のsetのインターフェイスを展開する。
Name | 既存の型と重複しない任意の名前。setの型名と関数のプレフィックスになる | |
Type | 任意の要素の型 |
Type に括弧を付けないこと。
#define CSTL_SET_IMPLEMENT | ( | Name, | |||
Type, | |||||
Compare | ) |
set用実装マクロ
CSTL_SET_INTERFACE()で展開したインターフェイスの実装を展開する。
int comp(Type x, Type y);
Name | 既存の型と重複しない任意の名前。setの型名と関数のプレフィックスになる | |
Type | 任意の要素の型 | |
Compare | 要素を比較する関数またはマクロ |
Type に括弧を付けないこと。
#define CSTL_MULTISET_INTERFACE | ( | Name, | |||
Type | ) |
#define CSTL_MULTISET_IMPLEMENT | ( | Name, | |||
Type, | |||||
Compare | ) |
#define CSTL_LESS | ( | x, | |||
y | ) | ((x) == (y) ? 0 : (x) < (y) ? -1 : 1) |
昇順指定
要素を昇順にソートする場合、 CSTL_SET_IMPLEMENT() , CSTL_MULTISET_INTERFACE() の Compare 引数に指定する。
x | 1つ目の値 | |
y | 2つ目の値 |
0 | x == y の場合 | |
負の値 | x < y の場合 | |
正の値 | x > y の場合 |
#define CSTL_GREATER | ( | x, | |||
y | ) | ((x) == (y) ? 0 : (x) > (y) ? -1 : 1) |
降順指定
要素を降順にソートする場合、 CSTL_SET_IMPLEMENT() , CSTL_MULTISET_INTERFACE() の Compare 引数に指定する。
x | 1つ目の値 | |
y | 2つ目の値 |
0 | x == y の場合 | |
負の値 | x > y の場合 | |
正の値 | x < y の場合 |
typedef struct SetRBTree* SetIterator |
イテレータの型
要素の位置を示す。
以下、関数から返されたイテレータを有効なイテレータという。 宣言されただけのイテレータ、または削除された要素のイテレータを無効なイテレータという。
Set* Set_new | ( | void | ) |
生成
要素数が0のset/multisetを生成する。
メモリ不足の場合、NULLを返す。
void Set_delete | ( | Set * | self | ) |
破棄
self のすべての要素を削除し、self を破棄する。 self がNULLの場合、何もしない。
self | setオブジェクト |
size_t Set_size | ( | Set * | self | ) |
要素数を取得
self | setオブジェクト |
int Set_empty | ( | Set * | self | ) |
空チェック
self | setオブジェクト |
self の要素数が1以上の場合、0を返す。
SetIterator Set_begin | ( | Set * | self | ) |
最初の要素のイテレータ
self | setオブジェクト |
SetIterator Set_end | ( | Set * | self | ) |
最後の要素の次のイテレータ
self | setオブジェクト |
SetIterator Set_rbegin | ( | Set * | self | ) |
最後の要素のイテレータ
self | setオブジェクト |
SetIterator Set_rend | ( | Set * | self | ) |
最初の要素の前のイテレータ
self | setオブジェクト |
SetIterator Set_next | ( | SetIterator | pos | ) |
次のイテレータ
pos | イテレータ |
pos が Set_end() または Set_rend() でないこと。
SetIterator Set_prev | ( | SetIterator | pos | ) |
前のイテレータ
pos | イテレータ |
pos が Set_end() または Set_rend() でないこと。
T const* Set_data | ( | SetIterator | pos | ) |
イテレータによる要素のアクセス
pos | イテレータ |
pos が Set_end() または Set_rend() でないこと。
SetIterator Set_insert | ( | Set * | self, | |
T | data, | |||
int * | success | |||
) |
要素を挿入(set専用)
data のコピーをself に挿入する。
self | setオブジェクト | |
data | 挿入するデータ | |
success | 成否を格納する変数へのポインタ。ただし、NULLを指定した場合はアクセスしない。 |
self が既にdata という値の要素を持っている場合、挿入を行わず、*success に0を格納し、その要素のイテレータを返す。
メモリ不足の場合、*success に0を格納し、self の変更を行わず0を返す。
SetIterator Set_insert | ( | Set * | self, | |
T | data | |||
) |
要素を挿入(multiset専用)
data のコピーをself に挿入する。 self が既にdata という値の要素を持っている場合、その値の一番最後の位置に挿入される。
self | setオブジェクト | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
int Set_insert_range | ( | Set * | self, | |
SetIterator | first, | |||
SetIterator | last | |||
) |
指定範囲の要素を挿入
[first, last)の範囲の要素のコピーをself に挿入する。 multisetの場合、[first, last)の要素はself が持つ要素でもよい。
self | setオブジェクト | |
first | コピー元の範囲の開始位置 | |
last | コピー元の範囲の終了位置 |
メモリ不足の場合、self の変更を行わず0を返す。
SetIterator Set_erase | ( | Set * | self, | |
SetIterator | pos | |||
) |
要素を削除
self のpos が示す位置の要素を削除する。
self | setオブジェクト | |
pos | 削除する要素の位置 |
pos が Set_end() または Set_rend() でないこと。
SetIterator Set_erase_range | ( | Set * | self, | |
SetIterator | first, | |||
SetIterator | last | |||
) |
指定範囲の要素を削除
self の[first, last)の範囲の要素を削除する。
self | setオブジェクト | |
first | 削除する範囲の開始位置 | |
last | 削除する範囲の終了位置 |
size_t Set_erase_key | ( | Set * | self, | |
T | data | |||
) |
指定した値の要素を削除
self のdata という値の要素をすべて削除する。
self | setオブジェクト | |
data | 削除する要素の値 |
void Set_clear | ( | Set * | self | ) |
全要素を削除
self のすべての要素を削除する。
self | setオブジェクト |
交換
self とx の内容を交換する。
self | setオブジェクト | |
x | self と内容を交換するsetオブジェクト |
size_t Set_count | ( | Set * | self, | |
T | data | |||
) |
指定した値の要素をカウント
self | setオブジェクト | |
data | カウントする要素の値 |
SetIterator Set_find | ( | Set * | self, | |
T | data | |||
) |
指定した値の要素を検索
self のdata という値の最初の要素を検索する。
self | setオブジェクト | |
data | 検索する要素の値 |
見つからない場合、 Set_end(self) を返す。
SetIterator Set_lower_bound | ( | Set * | self, | |
T | data | |||
) |
最初の位置の検索
ソートの基準に従い、self のdata 以上 の値の最初の要素を検索する。
self | setオブジェクト | |
data | 検索する要素の値 |
見つからない場合、 Set_end(self) を返す。
SetIterator Set_upper_bound | ( | Set * | self, | |
T | data | |||
) |
最後の位置の検索
ソートの基準に従い、self のdata より大きい 値の最初の要素を検索する。
self | setオブジェクト | |
data | 検索する要素の値 |
見つからない場合、 Set_end(self) を返す。