マクロ定義 | |
#define | CSTL_VECTOR_INTERFACE(Name, Type) |
インターフェイスマクロ | |
#define | CSTL_VECTOR_IMPLEMENT(Name, Type) |
実装マクロ | |
型定義 | |
typedef struct Vector | Vector |
vectorの型 | |
関数 | |
Vector * | Vector_new (void) |
生成 | |
Vector * | Vector_new_reserve (size_t n) |
許容量を予約して生成 | |
void | Vector_delete (Vector *self) |
破棄 | |
size_t | Vector_size (Vector *self) |
要素数を取得 | |
int | Vector_empty (Vector *self) |
空チェック | |
size_t | Vector_capacity (Vector *self) |
許容量を取得 | |
int | Vector_reserve (Vector *self, size_t n) |
許容量を予約 | |
void | Vector_shrink (Vector *self, size_t n) |
許容量を縮小 | |
T * | Vector_at (Vector *self, size_t idx) |
インデックスによる要素のアクセス | |
T * | Vector_front (Vector *self) |
最初の要素のアクセス | |
T * | Vector_back (Vector *self) |
最後の要素のアクセス | |
int | Vector_insert (Vector *self, size_t idx, T data) |
要素を挿入 | |
int | Vector_insert_n (Vector *self, size_t idx, size_t n, T data) |
複数個の要素を挿入 | |
int | Vector_insert_array (Vector *self, size_t idx, T const *data, size_t n) |
配列の要素を挿入 | |
int | Vector_insert_range (Vector *self, size_t idx, Vector *x, size_t xidx, size_t n) |
指定範囲の要素を挿入 | |
int | Vector_push_back (Vector *self, T data) |
末尾に要素を挿入 | |
void | Vector_erase (Vector *self, size_t idx, size_t n) |
要素を削除 | |
void | Vector_pop_back (Vector *self) |
最後の要素を削除 | |
void | Vector_clear (Vector *self) |
全要素を削除 | |
int | Vector_resize (Vector *self, size_t n, T data) |
要素数を変更 | |
void | Vector_swap (Vector *self, Vector *x) |
交換 |
vectorを使うには、<cstl/vector.h>をインクルードし、以下のマクロを用いてコードを展開する必要がある。
#include <cstl/vector.h> #define CSTL_VECTOR_INTERFACE(Name, Type) #define CSTL_VECTOR_IMPLEMENT(Name, Type)
CSTL_VECTOR_INTERFACE() は任意の名前と要素の型のvectorのインターフェイスを展開する。 CSTL_VECTOR_IMPLEMENT() はその実装を展開する。
また、CSTL_VECTOR_INTERFACE() を展開する前に、<cstl/algorithm.h>をインクルードすることにより、 アルゴリズムが使用可能となる。
#include <stdio.h> #include <cstl/vector.h> CSTL_VECTOR_INTERFACE(IntVector, int) /* インターフェイスを展開 */ CSTL_VECTOR_IMPLEMENT(IntVector, int) /* 実装を展開 */ int main(void) { int i; /* intのvectorを生成。 * 型名・関数のプレフィックスはIntVectorとなる。 */ IntVector *vec = IntVector_new(); for (i = 0; i < 64; i++) { /* 末尾から要素を追加。自動的に拡張する */ IntVector_push_back(vec, i); } /* 許容量の拡張 */ printf("capacity: %d\n", IntVector_capacity(vec)); IntVector_reserve(vec, 128); for (i = 0; i < 64; i++) { /* 先頭に要素を挿入 */ IntVector_insert(vec, 0, i); } /* 要素数 */ printf("size: %d\n", IntVector_size(vec)); for (i = 0; i < IntVector_size(vec); i++) { /* インデックスによる要素の読み書き */ printf("%d,", *IntVector_at(vec, i)); *IntVector_at(vec, i) += 1; printf("%d\n", *IntVector_at(vec, i)); } /* 先頭から要素数の半分削除 */ IntVector_erase(vec, 0, IntVector_size(vec) / 2); printf("size: %d\n", IntVector_size(vec)); /* 使い終わったら破棄 */ IntVector_delete(vec); return 0; }
#define CSTL_VECTOR_INTERFACE | ( | Name, | |||
Type | ) |
インターフェイスマクロ
任意の名前と要素の型のvectorのインターフェイスを展開する。
Name | 既存の型と重複しない任意の名前。vectorの型名と関数のプレフィックスになる | |
Type | 任意の要素の型 |
Type に括弧を付けないこと。
#define CSTL_VECTOR_IMPLEMENT | ( | Name, | |||
Type | ) |
実装マクロ
CSTL_VECTOR_INTERFACE()で展開したインターフェイスの実装を展開する。
Name | 既存の型と重複しない任意の名前。vectorの型名と関数のプレフィックスになる | |
Type | 任意の要素の型 |
Type に括弧を付けないこと。
vectorの型
抽象データ型となっており、内部データメンバは非公開である。
以下、 Vector_new*() から返されたVector構造体へのポインタをvectorオブジェクトという。
Vector* Vector_new | ( | void | ) |
生成
要素数が0のvectorを生成する。
メモリ不足の場合、NULLを返す。
Vector* Vector_new_reserve | ( | size_t | n | ) |
許容量を予約して生成
許容量(内部メモリの再割り当てを行わずに格納できる要素数)がn 個、 要素数が0のvectorを生成する。
n | 許容量 |
メモリ不足の場合、NULLを返す。
void Vector_delete | ( | Vector * | self | ) |
破棄
self のすべての要素を削除し、self を破棄する。 self がNULLの場合、何もしない。
self | vectorオブジェクト |
size_t Vector_size | ( | Vector * | self | ) |
要素数を取得
self | vectorオブジェクト |
int Vector_empty | ( | Vector * | self | ) |
空チェック
self | vectorオブジェクト |
self の要素数が1以上の場合、0を返す。
size_t Vector_capacity | ( | Vector * | self | ) |
許容量を取得
self | vectorオブジェクト |
int Vector_reserve | ( | Vector * | self, | |
size_t | n | |||
) |
許容量を予約
self の許容量を要素n 個の領域に拡張する。 self が持つ要素は維持され、拡張した領域の初期化はしない。
self | vectorオブジェクト | |
n | 許容量 |
n がself の現在の許容量以下の場合、self の変更を行わず非0を返す。
メモリ不足の場合、self の変更を行わず0を返す。
void Vector_shrink | ( | Vector * | self, | |
size_t | n | |||
) |
許容量を縮小
self の許容量を要素n 個の領域に縮小する。 n がself の現在の要素数以下の場合、self の許容量を要素数と同じにする。 n がself の現在の許容量以上の場合、何もしない。
self | vectorオブジェクト | |
n | 許容量 |
T* Vector_at | ( | Vector * | self, | |
size_t | idx | |||
) |
インデックスによる要素のアクセス
self | vectorオブジェクト | |
idx | インデックス |
T* Vector_front | ( | Vector * | self | ) |
最初の要素のアクセス
self | vectorオブジェクト |
T* Vector_back | ( | Vector * | self | ) |
最後の要素のアクセス
self | vectorオブジェクト |
int Vector_insert | ( | Vector * | self, | |
size_t | idx, | |||
T | data | |||
) |
要素を挿入
self のidx 番目の位置に、data のコピーを挿入する。
self | vectorオブジェクト | |
idx | 挿入する位置 | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
int Vector_insert_n | ( | Vector * | self, | |
size_t | idx, | |||
size_t | n, | |||
T | data | |||
) |
複数個の要素を挿入
self のidx 番目の位置に、data のコピーをn 個挿入する。
self | vectorオブジェクト | |
idx | 挿入する位置 | |
n | 挿入するデータの個数 | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
int Vector_insert_array | ( | Vector * | self, | |
size_t | idx, | |||
T const * | data, | |||
size_t | n | |||
) |
配列の要素を挿入
self のidx 番目の位置に、data という配列からn 個の要素のコピーを挿入する。
self | vectorオブジェクト | |
idx | 挿入する位置 | |
data | 挿入するデータの配列 | |
n | 挿入するデータの個数 |
メモリ不足の場合、self の変更を行わず0を返す。
data がNULLでないこと。
指定範囲の要素を挿入
self のidx 番目の位置に、x のxidx 番目からn 個の要素のコピーを挿入する。 self とx は同じオブジェクトでもよい。
self | vectorオブジェクト | |
idx | 挿入する位置 | |
x | コピー元のvectorオブジェクト | |
xidx | x のコピー開始インデックス | |
n | コピーする要素数 |
メモリ不足の場合、self の変更を行わず0を返す。
idx がself の要素数以下の値であること。
int Vector_push_back | ( | Vector * | self, | |
T | data | |||
) |
末尾に要素を挿入
data のコピーをself の最後の要素として挿入する。
self | vectorオブジェクト | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
void Vector_erase | ( | Vector * | self, | |
size_t | idx, | |||
size_t | n | |||
) |
要素を削除
self のidx 番目からn 個の要素を削除する。
self | vectorオブジェクト | |
idx | 削除開始インデックス | |
n | 削除する要素数 |
void Vector_pop_back | ( | Vector * | self | ) |
最後の要素を削除
self の最後の要素を削除する。
self | vectorオブジェクト |
void Vector_clear | ( | Vector * | self | ) |
全要素を削除
self のすべての要素を削除する。
self | vectorオブジェクト |
int Vector_resize | ( | Vector * | self, | |
size_t | n, | |||
T | data | |||
) |
要素数を変更
self の要素数をn 個に変更する。 n がself の現在の要素数以下の場合、要素数がn 個になるまで末尾から要素が削除される。 n がself の現在の要素数より大きい場合、要素数がn 個になるまでdata のコピーが末尾から挿入される。
self | vectorオブジェクト | |
n | 要素数 | |
data | 挿入するデータ |
メモリ不足の場合、self の変更を行わず0を返す。
交換
self とx の内容を交換する。
self | vectorオブジェクト | |
x | self と内容を交換するvectorオブジェクト |