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のいずれか