CSTLは、vector, deque, stringにおいて、共通なアルゴリズムを提供する。
アルゴリズムを使うには、CSTL_XXX_INTERFACE(Name, Type)*1を展開する前に、 algorithm.hというヘッダファイルをインクルードする必要がある。
#include <cstl/algorithm.h>
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <cstl/vector.h> #include <cstl/algorithm.h> /* CSTL_VECTOR_INTERFACE()の前にインクルード */ CSTL_VECTOR_INTERFACE(IntVector, int) /* インターフェイスを展開 */ CSTL_VECTOR_IMPLEMENT(IntVector, int) /* 実装を展開 */ /* intの比較関数 */ int int_less(const void *p1, const void *p2) { if (*(int*)p1 < *(int*)p2) { return -1; } else if (*(int*)p1 > *(int*)p2) { return 1; } else { return 0; } } int main(void) { int i; size_t idx; /* 許容量が32のintのvectorを生成 */ IntVector *vec = IntVector_new(32); srand(time(0)); for (i = 0; i < 64; i++) { /* 末尾から100未満のランダムな値の要素を追加 */ IntVector_push_back(vec, rand() % 100); } /* ソート */ IntVector_sort(vec, 0, IntVector_size(vec), int_less); for (i = 0; i < IntVector_size(vec); i++) { printf("%d\n", *IntVector_at(vec, i)); } printf("\n"); /* 50以上の最初の要素のインデックス */ idx = IntVector_lower_bound(vec, 0, IntVector_size(vec), 50, int_less); /* 先頭から50未満の要素までを逆順に並べ替え */ IntVector_reverse(vec, 0, idx); for (i = 0; i < IntVector_size(vec); i++) { printf("%d\n", *IntVector_at(vec, i)); } /* 使い終わったら破棄 */ IntVector_delete(vec); return 0; }
CSTL_XXX_INTERFACE(Name, Type)のNameにContainer, TypeにTを指定した場合、 以下のインターフェイスを提供する。
以下の関数において、 int (*comp)(const void *p1, const void *p2)という関数ポインタには、*p1 == *p2ならば0を、*p1 < *p2ならば正または負の整数を、*p1 > *p2ならば*p1 < *p2の場合と逆の符号の整数を返す関数を指定すること。 (C標準関数のqsort(), bsearch()に使用する関数ポインタと同じ仕様)
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_sort_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));
*1XXXは、VECTOR, DEQUE, STRINGのいずれか