マクロ定義 | |
#define | CSTL_DEQUE_INTERFACE(Name, Type) |
インターフェイスマクロ | |
#define | CSTL_DEQUE_IMPLEMENT(Name, Type) |
実装マクロ | |
型定義 | |
typedef struct Deque | Deque |
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 data) |
要素を挿入 | |
int | Deque_insert_n (Deque *self, size_t idx, size_t n, T data) |
複数個の要素を挿入 | |
int | Deque_insert_array (Deque *self, size_t idx, T const *data, 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 data) |
先頭に要素を挿入 | |
int | Deque_push_back (Deque *self, T data) |
末尾に要素を挿入 | |
void | Deque_erase (Deque *self, size_t idx, size_t n) |
要素を削除 | |
void | Deque_pop_front (Deque *self) |
最初の要素を削除 | |
void | Deque_pop_back (Deque *self) |
最後の要素を削除 | |
void | Deque_clear (Deque *self) |
全要素を削除 | |
int | Deque_resize (Deque *self, size_t n, T data) |
要素数を変更 | |
void | Deque_swap (Deque *self, Deque *x) |
交換 |
dequeを使うには、<cstl/deque.h>をインクルードし、以下のマクロを用いてコードを展開する必要がある。
#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() を展開する前に、<cstl/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となる。 */ 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 < IntDeque_size(deq); i++) { /* インデックスによる要素の読み書き */ printf("%d,", *IntDeque_at(deq, i)); *IntDeque_at(deq, i) += 1; printf("%d\n", *IntDeque_at(deq, i)); } /* 先頭から全要素を取り出して削除 */ while (!IntDeque_empty(deq)) { printf("%d\n", *IntDeque_front(deq)); IntDeque_pop_front(deq); } printf("size: %d\n", IntDeque_size(deq)); /* 使い終わったら破棄 */ IntDeque_delete(deq); return 0; }
#define CSTL_DEQUE_INTERFACE | ( | Name, | |||
Type | ) |
インターフェイスマクロ
任意の名前と要素の型のdequeのインターフェイスを展開する。
Name | 既存の型と重複しない任意の名前。dequeの型名と関数のプレフィックスになる | |
Type | 任意の要素の型 |
Type に括弧を付けないこと。
#define CSTL_DEQUE_IMPLEMENT | ( | Name, | |||
Type | ) |
実装マクロ
CSTL_DEQUE_INTERFACE()で展開したインターフェイスの実装を展開する。
Name | 既存の型と重複しない任意の名前。dequeの型名と関数のプレフィックスになる | |
Type | 任意の要素の型 |
Type に括弧を付けないこと。
Deque* Deque_new | ( | void | ) |
生成
要素数が0のdequeを生成する。
メモリ不足の場合、NULLを返す。
void Deque_delete | ( | Deque * | self | ) |
破棄
self のすべての要素を削除し、self を破棄する。 self がNULLの場合、何もしない。
self | dequeオブジェクト |
size_t Deque_size | ( | Deque * | self | ) |
要素数を取得
self | dequeオブジェクト |
int Deque_empty | ( | Deque * | self | ) |
空チェック
self | dequeオブジェクト |
self の要素数が1以上の場合、0を返す。
T* Deque_at | ( | Deque * | self, | |
size_t | idx | |||
) |
インデックスによる要素のアクセス
self | dequeオブジェクト | |
idx | インデックス |
T* Deque_front | ( | Deque * | self | ) |
最初の要素のアクセス
self | dequeオブジェクト |
T* Deque_back | ( | Deque * | self | ) |
最後の要素のアクセス
self | dequeオブジェクト |
int Deque_insert | ( | Deque * | self, | |
size_t | idx, | |||
T | data | |||
) |
要素を挿入
self のidx 番目の位置に、data のコピーを挿入する。
self | dequeオブジェクト | |
idx | 挿入する位置 | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
int Deque_insert_n | ( | Deque * | self, | |
size_t | idx, | |||
size_t | n, | |||
T | data | |||
) |
複数個の要素を挿入
self のidx 番目の位置に、data のコピーをn 個挿入する。
self | dequeオブジェクト | |
idx | 挿入する位置 | |
n | 挿入するデータの個数 | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
int Deque_insert_array | ( | Deque * | self, | |
size_t | idx, | |||
T const * | data, | |||
size_t | n | |||
) |
配列の要素を挿入
self のidx 番目の位置に、data という配列からn 個の要素のコピーを挿入する。
self | dequeオブジェクト | |
idx | 挿入する位置 | |
data | 挿入するデータの配列 | |
n | 挿入するデータの個数 |
メモリ不足の場合、self の変更を行わず0を返す。
data がNULLでないこと。
指定範囲の要素を挿入
self のidx 番目の位置に、x のxidx 番目からn 個の要素のコピーを挿入する。 self とx は同じオブジェクトでもよい。
self | dequeオブジェクト | |
idx | 挿入する位置 | |
x | コピー元のdequeオブジェクト | |
xidx | x のコピー開始インデックス | |
n | コピーする要素数 |
メモリ不足の場合、self の変更を行わず0を返す。
idx がself の要素数以下の値であること。
int Deque_push_front | ( | Deque * | self, | |
T | data | |||
) |
先頭に要素を挿入
data のコピーをself の最初の要素として挿入する。
self | dequeオブジェクト | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
int Deque_push_back | ( | Deque * | self, | |
T | data | |||
) |
末尾に要素を挿入
data のコピーをself の最後の要素として挿入する。
self | dequeオブジェクト | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
void Deque_erase | ( | Deque * | self, | |
size_t | idx, | |||
size_t | n | |||
) |
要素を削除
self のidx 番目からn 個の要素を削除する。
self | dequeオブジェクト | |
idx | 削除開始インデックス | |
n | 削除する要素数 |
void Deque_pop_front | ( | Deque * | self | ) |
最初の要素を削除
self の最初の要素を削除する。
self | dequeオブジェクト |
void Deque_pop_back | ( | Deque * | self | ) |
最後の要素を削除
self の最後の要素を削除する。
self | dequeオブジェクト |
void Deque_clear | ( | Deque * | self | ) |
全要素を削除
self のすべての要素を削除する。
self | dequeオブジェクト |
int Deque_resize | ( | Deque * | self, | |
size_t | n, | |||
T | data | |||
) |
要素数を変更
self の要素数をn 個に変更する。 n がself の現在の要素数以下の場合、要素数がn 個になるまで末尾から要素が削除される。 n がself の現在の要素数より大きい場合、要素数がn 個になるまでdata のコピーが末尾から挿入される。
self | dequeオブジェクト | |
n | 要素数 | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
交換
self とx の内容を交換する。
self | dequeオブジェクト | |
x | self と内容を交換するdequeオブジェクト |