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...