小練習 C語言實現乙個極簡通用vector

2021-09-26 09:10:48 字數 2118 閱讀 1079

c語言庫比較少,很大的原因就是沒有泛型,也沒有class。但是c語言作為乙個較為底層的系統級語言,操縱記憶體還是很靈活的。模仿c++實現乙個泛型vector,可以使用void*,使用的時候強轉對應型別,或者使用巨集來封裝一些操作。

這裡實現乙個極簡的vector,擁有增刪查功能,儲存的元素放在連續記憶體中,擴容時1.5倍增長。沒有加鎖,非執行緒安全。這個可以在控制結構體裡新增。原理很簡單,記憶體不夠了,malloc乙個原來1.5倍容量的新陣列,把老的資料memcpy過去然後釋放。刪除時,memmove對應元素即可。

c沒有class,那麼就把控制部分定義成乙個結構體,在每個函式的收個入參傳入,模擬cpp裡的隱藏的首引數this指標一樣。結構體定義細節也可以不對外部暴露,放到.c檔案中,在.h中重新定乙個乙個typedef,模擬cpp對class的封裝。

大致實現如下,100行以內就可以實現:)

#include

#include

#include

#include

struct vector

;void

ve_push_back

(struct vector *ve,

const

void

*item)

memcpy

(new_array, ve->head, old_len)

;free

(ve->head)

; ve->head = new_array;

}void

*last =

(char

*) ve->head + ve->item_num * ve->item_size;

memcpy

(last , item, ve->item_size)

; ve->item_num++;}

void

ve_erase

(struct vector *ve,

void

*item)

char

*last =

(char

*) ve->head + ve->item_size *

(ve->item_num -1)

;if(last <

(char

*)item)

if(item < ve->head)

ve->item_num--;if

((char

*)item < last )

}// return true if item1 equals item2

typedef bool (ve_comp_func)

(const

char

*item1,

const

char

*item2)

;void

*ve_find

(struct vector *ve,

const

void

*item, ve_comp_func comp)

}return

null;}

void

ve_init

(struct vector *ve, size_t item_size)

ve->item_size = item_size;

ve->item_num =0;

}void

ve_clear

(struct vector *ve)

//--------- test case ------------------

// an int vector

bool comp

(const

char

*item1,

const

char

*item2)

void

show_re

(struct vector *ve)

printf

("\n");

}int

main()

while

(n !=-2

)ve_clear

(&ve)

;return0;

}

構造的測試用例,可以從鍵盤獲取輸入來測試。

c語言 實現乙個棧

include include include include 入棧出站操作 typedef struct nodenode,pnode typedef struct stack pstack,stack void init pstack void push pstack,int bool isem...

C 乙個小練習

using system.collections.generic using system namespace csharp入門經典exercises public bool isalive return true public int age set public bool isewe set s...

C語言 實現乙個通訊錄

可以增容 通訊錄可以用來儲存無上限數量的人的資訊,每個人的資訊包括 姓名 性別 年齡 住址 新增聯絡人資訊 刪除指定聯絡人資訊 查詢指定聯絡人資訊 修改指定聯絡人資訊 顯示所有聯絡人資訊 清空所有聯絡人 排序所有聯絡人 ifndef contact h define contact h includ...