deque

dequeは可変長な両端キューである。 先頭と末尾での要素の挿入・削除の計算量がO(1)であり、それ以外の位置の要素の挿入・削除の計算量はO(N)である。 インデックスによる要素のランダムアクセスが可能。

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

#include <cstl/deque.h>

#define CSTL_DEQUE_INTERFACE(Name, Type)
#define CSTL_DEQUE_IMPLEMENT(Name, Type)

CSTL_DEQUE_INTERFACE()は任意の名前と要素の型のdequeのインターフェイスを展開する。 CSTL_DEQUE_IMPLEMENT()はその実装を展開する。 それぞれのマクロの引数は同じものを指定すること。 また、CSTL_DEQUE_INTERFACE()を展開する前に、algorithm.hをインクルードすることにより、 アルゴリズムが使用可能となる。

Name
既存の型と重複しない任意の名前。コンテナの型名と関数のプレフィックスになる
Type
任意の要素の型

使用例

#include <stdio.h>
#include <cstl/deque.h>

CSTL_DEQUE_INTERFACE(IntDeque, int) /* インターフェイスを展開 */
CSTL_DEQUE_IMPLEMENT(IntDeque, int) /* 実装を展開 */

int main(void)
{
    int i;
    /* intのdequeを生成 */
    IntDeque *deq = IntDeque_new();

    for (i = 0; i < 32; i++) {
        /* 末尾から追加 */
        IntDeque_push_back(deq, i);
    }
    for (i = 0; i < 32; i++) {
        /* 先頭から追加 */
        IntDeque_push_front(deq, i);
    }
    /* サイズ */
    printf("size: %d\n", IntDeque_size(deq));
    for (i = 0; i < 64; i++) {
        /* インデックスによる要素の読み書き */
        printf("%d,", *IntDeque_at(deq, i));
        *IntDeque_at(deq, i) += 1;
        printf("%d\n", *IntDeque_at(deq, i));
    }

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

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


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


Deque

Deque

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


Deque_new()

Deque *Deque_new(void);

Deque_delete()

void Deque_delete(Deque *self);

Deque_size()

size_t Deque_size(Deque *self);

Deque_empty()

int Deque_empty(Deque *self);

Deque_at()

T *Deque_at(Deque *self, size_t idx);

Deque_front()

T Deque_front(Deque *self);

Deque_back()

T Deque_back(Deque *self);

Deque_insert()

int Deque_insert(Deque *self, size_t idx, T elem);

Deque_insert_n()

int Deque_insert_n(Deque *self, size_t idx, size_t n, T elem);

Deque_insert_array()

int Deque_insert_array(Deque *self, size_t idx, const T *elems, size_t n);

Deque_insert_range()

int Deque_insert_range(Deque *self, size_t idx, Deque *x, size_t xidx, size_t n);

Deque_push_front()

int Deque_push_front(Deque *self, T elem);

Deque_push_back()

int Deque_push_back(Deque *self, T elem);

Deque_erase()

void Deque_erase(Deque *self, size_t idx, size_t n);

Deque_pop_front()

T Deque_pop_front(Deque *self);

Deque_pop_back()

T Deque_pop_back(Deque *self);

Deque_clear()

void Deque_clear(Deque *self);

Deque_resize()

int Deque_resize(Deque *self, size_t n, T elem);

Deque_swap()

void Deque_swap(Deque *self, Deque *x);