CCAN之2 darray

经过筛选先学习动态数组,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) {...}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jjinl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值