algorithm

CSTLは、vector, deque, stringにおいて、共通なアルゴリズムを提供する。

アルゴリズムを使うには、CSTL_XXX_INTERFACE*1を展開する前に、 algorithm.hというヘッダファイルをインクルードする。

#include <cstl/algorithm.h>

CSTL_XXX_INTERFACEの引数のNameにContainer, TypeにTを指定した場合、 以下のインターフェイスを提供する。

関数

以下の関数において、Container*型の引数はNULLでないことを事前条件に含める。

また、int (*comp)(const void *p1, const void *p2)という関数ポインタには、*p1 == *p2ならば0を、*p1 < *p2ならば正または負の整数を、*p1 > *p2ならば*p1 < *p2の場合と逆の符号の整数を返す関数を指定すること。

ソート
void Container_sort(Container *self, size_t idx, size_t n, int (*comp)(const void *p1, const void *p2));

void Container_stable_sort(Container *self, size_t idx, size_t n, int (*comp)(const void *p1, const void *p2));

二分探索
size_t Container_binary_search(Container *self, size_t idx, size_t n, T value, int (*comp)(const void *p1, const void *p2));

size_t Container_lower_bound(Container *self, size_t idx, size_t n, T value, int (*comp)(const void *p1, const void *p2));

size_t Container_upper_bound(Container *self, size_t idx, size_t n, T value, int (*comp)(const void *p1, const void *p2));

並べ替え
void Container_reverse(Container *self, size_t idx, size_t n);

void Container_rotate(Container *self, size_t first, size_t middle, size_t last);

マージ
int Container_merge(Container *self, size_t idx, Container *x, size_t xidx, size_t xn, 
                  Container *y, size_t yidx, size_t yn, int (*comp)(const void *p1, const void *p2));

void Container_inplace_merge(Container *self, size_t first, size_t middle, size_t last, 
                            int (*comp)(const void *p1, const void *p2));

ヒープ
void Container_make_heap(Container *self, size_t idx, size_t n, int (*comp)(const void *p1, const void *p2));

void Container_push_heap(Container *self, size_t idx, size_t n, int (*comp)(const void *p1, const void *p2));

void Container_pop_heap(Container *self, size_t idx, size_t n, int (*comp)(const void *p1, const void *p2));

void Container_sort_heap(Container *self, size_t idx, size_t n, int (*comp)(const void *p1, const void *p2));


*1XXXは、VECTOR, DEQUE, STRINGのいずれか