はじめに
この記事は長野高専 Advent Calender 2022 14日目の記事です.
そんなわけでc++のvectorを参考に使いやすく汎用性の高い動的配列を作りました.
ソースコード
そこそこ長いのでgithubにあげました.
https://github.com/Bet-Amoto/Vector-of-C
vector.h,vector.cが本文です.ソースコードの説明はめんどくさいので割愛します.暇だったり需要があったりするなら書くかもしれません.
注意書き
この動的配列には一部保証されない動作が含まれています.基本的には問題なく動作すると思いますが,もしかするとおかしな挙動をする可能性があります.使用は自己責任でお願いします.(コメントでの指摘により追記 2022/12/14)
使い方
宣言
この動的配列は次のように宣言します.charやintはもちろん,2次元配列や自作構造体の型にも対応しています.vector_initの引数は,動的配列にする型と,最初のサイズです.この時点では,値の初期化はされないことに注意してください.
vector(char) ch_vec = vector_init(char,5);
vector(int) int_vec = vector_init(int,10);
vector(vector(char)) str_vec = vector_init(vector(char),2);
vector(Vec2) vec2_vec = vector_init(Vec2,100);
要素へのアクセス
配列の要素には通常の配列と同じようにアクセスできます.また,vector_atを使ってアクセスすることもできます.
vector_sizeは,配列の大きさをsize_t型で返します.
vector(int) vec = vector_init(int,5);
for(int i = 0; i < vector_size(vec); i++){
vec[i] = i;
}
// vec -> [ 0, 1, 2, 3, 4]
要素の追加・消去
要素の追加・消去には次の関数が用意されています.
//配列(vac)の後ろに値(val)を追加
vector_push_back(vec,val);
//配列のn番目に値を挿入
vector_insert(vec,n,val);
//配列の一番後ろの値を消去
vector_popback(vec);
//配列のn番目の値を消去
vector_erace(x,n);
メモリの開放
動的配列を実装するにあたって,mallocを使用しています.なので,プログラムが終了する前に自分でメモリを開放する必要があります.
//動的配列のメモリの開放
vector_free(vec);
ソート,反転
ソート,要素の順番の反転をする関数があります.便利.
// int型の値を昇順にソートするときに使用する関数
int compareInt(const void* a,const void* b){
return *(int*)a - *(int*)b;
}
int main(){
vector(int) vec = vector_init(int,5);
vec[0] = 1;
vec[1] = 3;
vec[2] = 5;
vec[3] = 4;
vec[4] = 2;
//vec -> [ 1, 3, 5, 4, 2]
vector_sort(vec,compareInt);
//vec -> [ 1, 2, 3, 4, 5]
vector_revears(vec);
//vec -> [ 5, 4, 3, 2, 1]
vector_free(vec);
return 0;
}
終わりに
個人的にはかなり満足のいくできの動的配列が作れました.もし,ばぐあるぞーとかもっといい実装方法あるぞーとかある方は教えていただけると嬉しいです.
それでは,地獄の楽しいc言語ライフをお過ごしください.