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