list

listを使うには、list.hというヘッダファイルをインクルードする。

#include <cstl/list.h>

以下のマクロを用いてコードを展開する必要がある。

/* インターフェイスを展開 */
#define CSTL_LIST_INTERFACE(Name, Type)

/* 実装を展開 */
#define CSTL_LIST_IMPLEMENT(Name, Type)

Nameに既存の型と重複しない任意の名前を、Typeに任意の要素の型を指定する。


CSTL_LIST_INTERFACEの引数のNameにList, TypeにTを指定した場合、 以下のインターフェイスを提供する。

List

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

ListIterator

イテレータの型。要素の位置を示す。 関数から返されたイテレータを有効なイテレータという。 宣言されただけのイテレータ、または削除された要素のイテレータを無効なイテレータという。

関数

以下の関数において、List*型の引数はNULLでないことを事前条件に含める。

生成
List *List_new(void);

破棄
void List_delete(List *self);

サイズ
size_t List_size(List *self);

int List_empty(List *self);

イテレータ
ListIterator List_begin(List *self);

ListIterator List_end(List *self);

ListIterator List_rbegin(List *self);

ListIterator List_rend(List *self);

ListIterator List_next(ListIterator pos);

ListIterator List_prev(ListIterator pos);

要素のアクセス
T *List_at(ListIterator pos);

T List_front(List *self);

T List_back(List *self);

挿入
ListIterator List_insert(List *self, ListIterator pos, T elem);

int List_insert_n(List *self, ListIterator pos, size_t n, T elem);

int List_insert_array(List *self, ListIterator pos, const T *elems, size_t n);

int List_insert_range(List *self, ListIterator pos, ListIterator first, ListIterator last);

int List_push_back(List *self, T elem);

int List_push_front(List *self, T elem);

削除
ListIterator List_erase(List *self, ListIterator pos);

ListIterator List_erase_range(List *self, ListIterator first, ListIterator last);

T List_pop_front(List *self);

T List_pop_back(List *self);

void List_clear(List *self);

サイズの変更
int List_resize(List *self, size_t n, T elem);

交換
void List_swap(List *self, List *x);

つなぎ替え
void List_splice(List *self, ListIterator pos, List *x, ListIterator first, ListIterator last);

ソート
void List_sort(List *self, int (*comp)(const void *p1, const void *p2));

並べ替え
void List_reverse(List *self);

マージ
void List_merge(List *self, List *x, int (*comp)(const void *p1, const void *p2));