[轉]:tbox中vector容器的使用

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);

其餘算法,能夠參考:排序和查找算法的使用


相關文章
相關標籤/搜索