经过筛选先学习动态数组,darray模块,这个模块只包含一个头文件darray.h,头文件中包含注释也只有363行。
主要通过宏定义一个结构体,通过结构体操作数组的动态变化。
如果申请一个int类型的动态数组
darray(int) kk;
定义一个整形的动态数组 kk,给这个数组初始化可以选择两种方式
1.定义的时候初始化
darray(int) kk = darray_new();
2.定义完后初始化
darray(int) kk;
darray_init(kk);
通过darray_append 插入数据,darray_append和printf一样,是可变参数
darray_push和darray_append一样
编译简单例子,如下:
#include <stdio.h>
#include "darray.h"
int main(int argc, char **argv)
{
int *p;
darray(int) kk;
printf("darray test\n");
darray_init(kk);
darray_append(kk, 3);
printf("分配大小: %d 实际大小:%d\n", darray_alloc(kk), darray_size(kk));
darray_foreach(p,kk){
printf("%d\n",*p);
}
darray_append(kk, 6);
printf("分配大小: %d 实际大小:%d\n", darray_alloc(kk), darray_size(kk));
darray_free(kk);
return 0;
}
打印如下:
使用套路基本如上
实际上darray_append定义的是可变参数,如果你如下调用
darray_append(kk,1,2,3,4,5,6,7,8);
只插入最后一个元素8
darray定义如下宏
初始化
darray(T) :定义一个类型
darray_new() :赋初值
darray_free(a) :释放动态数组空间
darray_init(a) :初始化动态数组
预定义类型
darray_char :等同于 darray(char)
darray_schar :等同于 darray(signed char)
darray_uchar :等同于 darray(unsigned char)
darray_short :等同于 darray(short)
darray_int :等同于 darray(int)
darray_long :等同于 darray(long)
darray_ushort :等同于 darray(unsigned short)
darray_uint :等同于 darray(unsigned int)
darray_ulong :等同于 darray(unsigned long)
访问相关
T darray_item(darray(T) arr, size_t index); 返回指定位置元素
size_t darray_size(darray(T) arr); 返回整个数据元素个数
size_t darray_alloc(darray(T) arr); 返回数组分配的大小
bool darray_empty(darray(T) arr); 判断数组是否为空
插入单个元素
void darray_append(darray(T) arr, T item); 插入元素item
void darray_prepend(darray(T) arr, T item);
void darray_insert(darray(T) arr, size_t index, T item);
void darray_push(darray(T) arr, T item); // same as darray_append
插入多个元素
void darray_append_items(darray(T) arr, T *items, size_t count);
void darray_prepend_items(darray(T) arr, T *items, size_t count);
void darray_appends(darray(T) arr, [T item, [...]]);
void darray_prepends(darray(T) arr, [T item, [...]]);
// Same functionality as above, but does not require typeof.
void darray_appends_t(darray(T) arr, #T, [T item, [...]]);
void darray_prepends_t(darray(T) arr, #T, [T item, [...]]);
删除元素
T darray_pop(darray(T) arr | darray_size(arr) != 0);
T* darray_pop_check(darray(T*) arr);
void darray_remove(darray(T) arr, size_t index);
修改元素
void darray_from_items(darray(T) arr, T *items, size_t count);
void darray_from_c(darray(T) arr, T c_array[N]);
字符串操作
void darray_append_string(darray(char) arr, const char *str);
void darray_append_lit(darray(char) arr, char stringLiteral[N+1]);
void darray_prepend_string(darray(char) arr, const char *str);
void darray_prepend_lit(darray(char) arr, char stringLiteral[N+1]);
void darray_from_string(darray(T) arr, const char *str);
void darray_from_lit(darray(char) arr, char stringLiteral[N+1]);
大小操作
void darray_resize(darray(T) arr, size_t newSize);
void darray_resize0(darray(T) arr, size_t newSize);
void darray_realloc(darray(T) arr, size_t newAlloc);
void darray_growalloc(darray(T) arr, size_t newAlloc);
void darray_make_room(darray(T) arr, size_t room);
遍历操作
darray_foreach(T *&i, darray(T) arr) {...}
darray_foreach_reverse(T *&i, darray(T) arr) {...}