经常使用C++、JAVA等面向对象语言开发的程序员都会比较喜欢容器的迭代器功能,用起来方便简洁。象一些常用的数据结构,如:哈希表、动态数组、链表等,在这些面向对象语言中都可以非常方便地使用迭代器。当然,在C语言中也有对这些常用数据结构的函数封装,但要对容器中元素的遍历,则一般会通过注册回调函数的方式。如下:
C代码
/* 以C语言中非常流行的 glib 库中的哈希表操作为例 */
static void print_record(gpointer key, gpointer val, gpointer ctx)
{
printf("%s: key(%s), value(%s)\n", (char*) ctx, (char*) key, (char*) val));
}
static void free_record(gpointer key, gpointer val, gpointer ctx)
{
printf("%s: free(%s) now\n", (char*) ctx, (char*) key);
free(val);
}
static void htable_test(void)
{
char *myname = "hash_test";
char key[32], *value;
GHashTable *table;
int i;
/* 创建哈希表 */
table = g_hash_table_new(g_str_hash, g_str_equal);
/* 依次向哈希表中添加数据 */
for (i = 0; i < 10; i++) {
snprintf(key, sizeof(key), "key:%d", i);
value = malloc(64);
snprintf(value, 64, "value:%d", i);
g_hash_table_insert(table, key, value);
}
/* 遍历并输出哈希表中的数据 */
g_hash_table_foreach(table, print_record, myname);
/* 依次释放哈希表中的数据 */
g_hash_table_foreach(table, free_record, myname);
/* 销毁哈希表 */
g_hash_table_destroy(table);
}
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!