algorithm

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()に使用する関数ポインタと同じ仕様)


Container_sort()

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

Container_stable_sort()

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

Container_binary_search()

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

Container_lower_bound()

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

Container_upper_bound()

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

Container_reverse()

void Container_reverse(Container *self, size_t idx, size_t n);

Container_rotate()

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

Container_merge()

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));

Container_inplace_merge()

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

Container_make_heap()

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

Container_sort_heap()

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

Container_push_heap()

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

Container_pop_heap()

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

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