浏览 3666 次
锁定老帖子 主题:C语言中也可以方便地进行遍历
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-16
最后修改:2009-08-17
请先看一个例子,如下: void test() { ACL_HTABLE *table = acl_htable_create(10, 0); /* 创建哈希表 */ ACL_HTABLE_ITER iter; /* 哈希表的遍历变量 */ char *value, key[32]; int i; for (i = 0; i < 100; i++) { value = (char*) acl_mystrdup("value"); snprintf(key, sizeof(key), "key:%d", i); (void) acl_htable_enter(table, key, value); /* 向哈希表中添加元素 */ } /* 遍历哈希表中的所有元素 */ acl_htable_foreach(iter, table) { printf("%s=%s\n", acl_htable_iter_key(iter), acl_htable_iter_value(iter)); } /* 释放哈希表表 */ acl_htable_free(table, acl_myfree_fn); }
哈,用C语言也可以实现其它编程语言里的迭代器,而且用法也异常简单,虽然它没有C++中的功能强大,但却比较实用,而且操作手法有点象D、JAVA的遍历方式。下面再请看一个利用ACL里的先进先出队列的例子:
void test() { ACL_FIFO fifo; ACL_FIFO_ITER iter; char *data; int i; acl_fifo_init(&fifo); /* 初始化队列对象 */ for (i = 0; i < 10; i++) { data = acl_mymalloc(32); snprintf(data, 32, "data: %d", i); acl_fifo_push(&fifo, data); /* 向队列中添加元素 */ } /* 反向遍历队列中的所有元素 */ acl_fifo_foreach_reverse(iter, &fifo) { printf("%s\n", (char*) iter.ptr->data); /* 打印元素字符串 */ } while (1) { /* 弹出队列中的所有元素 */ data = acl_fifo_pop(&fifo); if (data == NULL) break; } } 上面这个是ACL里反向遍历先进先出队列的例子。 我们在使用 C++ 里的迭代器里,其实基本上都是在用C++标准模板库的算法而已,这些常用算法无非也就是动态数组、哈希表、队列、堆栈等数据结构而已,而现在C++的使用替代器的过程未免过于烦琐(模板是由C++发扬光大,但现在搞的也太罗嗦了,不知C++标准委员会里的那些老头整天都在忙些什么,呵呵),我还是比较喜欢Java和D语言里的使用方式。 上面的两个例子的遍历过程其实是由宏来实现的,效率不会有问题,但写法也未免有些拙劣,呵呵,不过实用即可。具体实现方式请参考ACL里的头文件:lib_acl/include/stdlib/ 下的 acl_htable.h, acl_fifo.h. ACL库下载位置:https://acl.sourceforge.net 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-16
XCode 的 C 可以这样用:
void range_each(int from, int to, void (^f)(int)) { int i; for(i = from; i < to; ++i) f(i); } ... range_each(2, 15, ^(int x){ printf("%d",x); }); ... |
|
返回顶楼 | |
发表时间:2009-08-17
最后修改:2009-08-17
其实这还是一种函数回调的遍历方式,在ACL中的哈希表中有类似的作法,如修改上面例子的哈希表的遍历为回调遍历的方式如下:
static void walk_fn(ACL_HTABLE_INFO *info, void *arg acl_unused) { printf("%s=%s\n", info->key.c_key, (char*) info->value); } void test() { ACL_HTABLE *table = acl_htable_create(10, 0); /* 创建哈希表 */ ACL_HTABLE_ITER iter; /* 哈希表的遍历变量 */ char *value, key[32]; int i; for (i = 0; i < 100; i++) { value = (char*) acl_mystrdup("value"); snprintf(key, sizeof(key), "key:%d", i); (void) acl_htable_enter(table, key, value); /* 向哈希表中添加元素 */ } /* 遍历哈希表中的所有元素 */ acl_htable_walk(table, walk_fn, NULL); /* 释放哈希表表 */ acl_htable_free(table, acl_myfree_fn); } 但以回调方式遍历总给人有点不直观的感觉。 |
|
返回顶楼 | |