請先看一個例子,以下:算法
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編程語言
我的微博:http://weibo.com/zsxxsz.net