set/multiset

setは要素が値によって自動的にソートされるコンテナである。 同じ要素を2個以上挿入することはできない。 挿入した要素は読み出し専用となる。 要素の挿入・削除・検索の計算量はO(log N)である。

multisetは要素の重複が許されることを除き、setと同じである。

set/multisetを使うには、 以下のマクロを用いてコードを展開する必要がある。

#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()はその実装を展開する。 それぞれのマクロのCompare以外の引数は同じものを指定すること。

CSTL_MULTISET_INTERFACE()は任意の名前と要素の型のmultisetのインターフェイスを展開する。 CSTL_MULTISET_IMPLEMENT()はその実装を展開する。 それぞれのマクロのCompare以外の引数は同じものを指定すること。

Name
既存の型と重複しない任意の名前。コンテナの型名と関数のプレフィックスになる
Type
任意の要素の型
Compare
要素を比較する関数またはマクロ

使用例

#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 *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\n", IntSet_key(pos));
    }
    /* 3以上の要素を削除 */
    IntSet_erase_range(set, IntSet_find(set, 3), IntSet_end(set));

    /* 使い終わったら破棄 */
    IntSet_delete(set);
    return 0;
}

※複数のソースファイルから同じ型のコンテナを使用する場合は、 マクロ展開用のヘッダファイルとソースファイルを用意し、適宜インクルードやリンクをすればよい。


CSTL_SET_INTERFACE(Name, Type) , CSTL_MULTISET_INTERFACE(Name, Type)の NameにSet, TypeにTを指定した場合、 以下のインターフェイスを提供する。


Set

Set

コンテナの型。抽象データ型となっており、以下の関数によってのみアクセスできる。


SetIterator

SetIterator

イテレータの型。要素の位置を示す。 関数から返されたイテレータを有効なイテレータという。 宣言されただけのイテレータ、または削除された要素のイテレータを無効なイテレータという。


Set_new()

Set *Set_new(void);

Set_delete()

void Set_delete(Set *self);

Set_size()

size_t Set_size(Set *self);

Set_empty()

int Set_empty(Set *self);

Set_begin()

SetIterator Set_begin(Set *self);

Set_end()

SetIterator Set_end(Set *self);

Set_rbegin()

SetIterator Set_rbegin(Set *self);

Set_rend()

SetIterator Set_rend(Set *self);

Set_next()

SetIterator Set_next(SetIterator pos);

Set_prev()

SetIterator Set_prev(SetIterator pos);

Set_key()

T Set_key(SetIterator pos);

Set_insert() set用

SetIterator Set_insert(Set *self, T elem, int *success);

Set_insert() multiset用

SetIterator Set_insert(Set *self, T elem);

Set_insert_range()

int Set_insert_range(Set *self, SetIterator first, SetIterator last);

Set_erase()

SetIterator Set_erase(Set *self, SetIterator pos);

Set_erase_range()

SetIterator Set_erase_range(Set *self, SetIterator first, SetIterator last);

Set_erase_key()

size_t Set_erase_key(Set *self, T elem);

Set_clear()

void Set_clear(Set *self);

Set_swap()

void Set_swap(Set *self, Set *x);

Set_count()

size_t Set_count(Set *self, T elem);

Set_find()

SetIterator Set_find(Set *self, T elem);

Set_lower_bound()

SetIterator Set_lower_bound(Set *self, T elem);

Set_upper_bound()

SetIterator Set_upper_bound(Set *self, T elem);