文档章节

C语言中也可以方便地进行遍历

郑树新
 郑树新
发布于 2014/09/03 12:11
字数 534
阅读 29
收藏 1

  请先看一个例子,如下:

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

© 著作权归作者所有

郑树新

郑树新

粉丝 104
博文 87
码字总数 161171
作品 2
昌平
程序员
私信 提问
runtime 运行时机制 完全解读

我们前面已经讲过一篇runtime 原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助! 首先,第一个问题,1》runtime实现的机制是什么,怎么用,一般用于干嘛?这个问...

哥特复心
2014/08/06
0
10
使用python 实现icmp测试主机存活性

代码: 了解c语言的人,一定会知道struct结构体在c语言中的作用,它定义了一种结构,里面包含不同类型的数据(int,char,bool等等),方便对某一结构对象进行处理。而在网络通信当中,大多传递的...

qbs1989
2017/05/12
0
0
iOS可变参数实现及原理剖析

你一定会时常见到有些方法的最后会有一个无关痛痒的 nil 参数,可曾想过为什么要带这个参数呢。 解答:因为这里参数的传递是可变参数的传递,拿[NSArray arrayWithObjects:]为例子,我们进入他...

JasonMs
2015/10/24
326
0
Objective-C 语法之词典对象(NSDictionary/NSMutableDictionary)

做过Java语言 或者 C语言 开发的朋友应该很清楚 关键字map 吧,它可以将数据以键值对儿的形式储存起来,取值的时候通过KEY就可以直接拿到对应的值,非常方便。在Objective-C语言中 词典对象就...

鉴客
2011/10/04
9.4K
1
目前最细致清晰的NSDictionary以及NSMutableDictionary用法总结

做过Java语言 或者 C语言 开发的朋友应该很清楚 关键字map 吧,它可以将数据以键值对儿的形式储存起来,取值的时候通过KEY就可以直接拿到对应的值,非常方便。在Objective-C语言中 词典对象就...

zbser
2014/04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

动态代理知识详解

动态代理实现的两种方式 给动态代理举个栗子:例如我们平时买笔记本电脑,很多时候都是不从厂家拿货,而是通过经销商买电脑。代理模式出现解决了生产厂家的一些问题,那么这个这个思想在我们...

我叫小糖主
35分钟前
7
0
Calendar TimeZone SimpleDateFormat

关于Calendar类的使用可参考:Java Calendar类的使用总结 获取日历(Calendar):java.util.Calendar#getInstance() 获取时区TimeZone: TimeZone.getTimeZone("GMT+00:00"); 或:TimeZone.ge......

Hzhodor
35分钟前
0
0
这 17 个 JVM 参数,高级 Java 必须掌握

前言 大家都知道,jvm在启动的时候,会执行默认的一些参数。一般情况下,这些设置的默认参数应对一些平常的项目也够用了。但是如果项目特别大了,需要增加一下堆内存的大小、或者是系统老是莫...

编程SHA
41分钟前
0
0
jenkins配置自动发送邮件

1.开通QQ的SMTP服务,需要发一条短信,qq会给你一个密码(不是你的QQ邮箱密码哦) 2.安装 Email Extension Plugin 插件 3.进入系统管理--系统设置 3.1按照如下图设置 首先找到 Extended E-m...

shzwork
45分钟前
0
0
网络请求异常拦截优化

目录介绍 01.网络请求异常分类 02.开发中注意问题 03.原始的处理方式 04.如何减少代码耦合性 05.异常统一处理步骤 06.完成版代码展示 好消息 博客笔记大汇总【16年3月到至今】,包括Java基础...

潇湘剑雨
50分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部