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をインクルードすることにより、 アルゴリズムが使用可能となる。
#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(void);
void Deque_delete(Deque *self);
size_t Deque_size(Deque *self);
int Deque_empty(Deque *self);
T *Deque_at(Deque *self, size_t idx);
T Deque_front(Deque *self);
T Deque_back(Deque *self);
int Deque_insert(Deque *self, size_t idx, T elem);
int Deque_insert_n(Deque *self, size_t idx, size_t n, T elem);
int Deque_insert_array(Deque *self, size_t idx, const T *elems, size_t n);
int Deque_insert_range(Deque *self, size_t idx, Deque *x, size_t xidx, size_t n);
int Deque_push_front(Deque *self, T elem);
int Deque_push_back(Deque *self, T elem);
void Deque_erase(Deque *self, size_t idx, size_t n);
T Deque_pop_front(Deque *self);
T Deque_pop_back(Deque *self);
void Deque_clear(Deque *self);
int Deque_resize(Deque *self, size_t n, T elem);
void Deque_swap(Deque *self, Deque *x);