tbox的vector容器沿用了stl庫中vector的命名,說白了就是以數組方式存儲元素,也是整個容器庫中最基礎的容器之一。git
固然,在c中用tbox的vector跟用stl的vector其實差不了太多,用起來都很方便。github
先看個簡單的例子熟悉下:算法
// 初始化一個維護大小寫敏感字符串的vector容器,第一參數設置元素自動增加大小,這裏使用0表示默認大小 tb_vector_ref_t vector = tb_vector_init(0, tb_element_str(tb_true)); if (vector) { // 在頭部插入元素 tb_vector_insert_head(vector, "hi!"); // 在尾部插入元素 tb_vector_insert_tail(vector, "how"); tb_vector_insert_tail(vector, "are"); tb_vector_insert_tail(vector, "you"); // 遍歷打印全部元素 tb_for_all (tb_char_t const*, cstr, vector) { // trace tb_trace_d("%s", cstr); } // 銷燬vector容器 tb_vector_exit(vector); }
裏面的tb_for_all
是用迭代器遍歷容器,這個對全部的容器都支持,具體使用能夠參考:迭代器的使用api
vector不只能夠在頭尾插入元素,還能夠在指定索引的位置的先後插入元素:數組
// 在索引1的位置,插入元素,新元素的索引爲1 tb_vector_insert_next(vector, 1, "xxx"); // 在索引1的前面插入元素, 新元素的索引爲0 tb_vector_insert_prev(vector, 1, "xxx");
若是你要插入一連串重複的元素,可使用 tb_vector_ninsert_xxx
版本:函數
// 連續在尾部插入10個重複的"xxx" tb_vector_ninsert_head(vector, "xxx", 10); // 連續在頭部插入10個重複的"xxx" tb_vector_ninsert_tail(vector, "xxx", 10);
若是要替換指定索引位置的元素內容,可使用replace系列操做:ui
// 替換索引5的元素內容爲"xxx",前提是這個元素本來就存在 tb_vector_replace(vector, 5, "xxx");
要刪除指定索引的元素,更簡單:.net
// 刪除索引位置5處的元素 tb_vector_remove(vector, 5); // 刪除頭部的一個元素 tb_vector_remove_head(vector); // 刪除尾部最後一個元素 tb_vector_remove_last(vector);
像 替換、刪除、插入等操做都有對應的 ninsert/nreplace/nremove
等批量處理連續重複數據的接口,這裏就不細說了。。debug
在debug模式下,你還有使用dump接口,快速打印這個vector容器的全部數據信息,方便調試,不過只能在debug下使用哦:指針
#ifdef __tb_debug__ // dump 全部元素信息 tb_vector_dump(vector); #endif
不單單是vector,全部容器的元素定義,所有采用tb_element_xxx
的接口來定義,不只能維護字符串,還能維護各類類型:
tb_element_long: 元素類型爲整數:tb_long_t
tb_element_size: 元素類型爲整數:tb_size_t
tb_element_uint8: 元素類型爲整數:tb_uint8_t
tb_element_uint16: 元素類型爲整數:tb_uint16_t
tb_element_uint32: 元素類型爲整數:tb_uint32_t
tb_element_str: 元素類型爲字符串,支持:大小寫敏感區分
tb_element_ptr: 元素類型爲指針,支持自定義free回調,釋放指針對應的元素數據,至關於析構函數
tb_element_mem: 元素類型爲內存,通常用於內置結構體元素的維護,容器會吧整個結構體的數據維護在容器內部,同時也支持自定義free函數
tb_element_obj: 元素類型爲object對象,用於object模塊中對象的維護,支持自動維護引用計數和對象釋放
通常狀況下,自定義的各類結構體數據,能夠經過tb_element_ptr/tb_element_mem
維護都能知足需求,這二者的區別在於,前者只維護指針,不維護數據,後者直接維護數據。
固然若是以爲這樣還不能知足本身的需求,也能夠自定義本身的element類型,只要繼承下tb_element_t
類型,實現下對應的api就好了。。
並且包括vector的全部容器,都跟algorithm算法庫緊密相連,全部算法經過迭代器均可以完美適配各類容器,例如:
// 使用通用算法接口remove移除全部內容爲"xxx"的元素 tb_remove(vector, "xxx"); // 移除第一個內容爲"xxx"的元素 tb_remove_first(vector, "xxx"); // 移除全部 < 10的元素,tb_predicate_le是謂詞函數,也能夠實現本身的謂詞邏輯 tb_remove_if(vector, tb_predicate_le, (tb_cpointer_t)10); // 統計全部 > 10的元素個數 tb_count_all_if(vector, tb_predicate_be, (tb_cpointer_t)10);
其餘算法,能夠參考:排序和查找算法的使用