iOS标准库中常用数据结构和算法之查找
参数:
key: [in] 要查找的元素。
base:[in] 数组元素的首地址。
nelp: [in/out] 数组的元素个数指针。
width: [in] 数组中每个元素的尺寸。
compar: [in] 函数比较器,查找时会对数组中的每个元素进行遍历并和要查找的元素调用函数比较器来判断是否匹配成功。函数比较器的格式如下:
/*
@key: 是要查找的元素,也是上面lfind和lsearch中传入的第一个参数key。
@element: 元素在数组中的地址,这里需要注意的是这个参数不是元素本身,而是元素所在的数组中的偏移地址。
@return: 如果比较结果相等则返回0,否则返回非0
*/
int compar(const void *key, const void *element);
return:[out] 如果数组中找到了对应的元素,则返回元素在数组中的地址,如果没有找到则lfind返回NULL。而lsearch则会将要查找的元素追加到数组后面,并返回元素在数组中的地址,同时更新nelp的值。
描述:
系统提供的lfind和lsearch函数都是用于线性查找,但是二者的区别是:
lsearch中的key必须和数组的元素是相同的数据类型,而lfind则没有这个要求。
因为lsearch函数在查找不到时会将key的内容拷贝(memcpy)到数组的尾部,因此lsearch除了具有查找外还有添加数组元素的能力,而且数组的容量应该要大于nelp参数中所指定的数组的元素个数,否则就有可能产生异常。同时在函数返回后nelp中保存的将是最终数组中实际的元素个数,这也是为什么nelp要以指针的形式进行传递。而lfind则只是查找并不会追加。
lsearch也有可能在查找添加失败时返回NULL。
示例代码:
typedef struct student
{
int age;
char *name;
} student_t;
//注意这里的key的类型可以不和数组元素类型相同,同时第二个参数是元素在数组中的指针而不是元素本身。
int lfindcompar(const char *key, const student_t *pstudent)
{
return strcmp(key, pstudent->name);
}
//注意这里的key的类型必须要和数组元素类型相同,同时第二个参数是元素在数组中的指针而不是元素本身。
int lsearchcompar(const student_t *key, const student_t *pstudent)
{
return strcmp(key->name, pstudent->name);
}
void main()
{
student_t students[10] = {{10, "Bob"}, {20, "Alex"}, {15, "Lucy"}, {19, "Ada"}, {25, "Max"}};
size_t count = 5; // 实际的元素个数为5
//lfind第一次查找没有找到
student_t *pstudent = lfind("Lily", students, &count, sizeof(student_t), &lfindcompar);
NSAssert(pstudent == NULL, @"oops"); //没有找到。
student_t newstudent = {20, "Lily"};
//lsearch中的key的类型必须要和数组元素类型保持一致,如果没有找到就会添加到数组尾部,并且数量参数count会加1
pstudent = lsearch(&newstudent, students, &count, sizeof(student_t), &lsearchcompar);
NSAssert(pstudent != NULL && count == 6, @"oops");
//再次通过lfind就查找成功了。
pstudent = lfind("Lily", students, &count, sizeof(student_t), &lfindcompar);
NSAssert(pstudent != NULL, @"oops");
}
iOS标准库中常用数据结构和算法之查找的更多相关文章
- STL笔记(6)标准库:标准库中的排序算法
STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew A ...
- 彻底弄清c标准库中string.h里的常用函数用法
在我们平常写的c/c++程序,一些算法题中,我们常常会用到c标准库中string.h文件中的函数,这些函数主要用于处理内存,字符串相关操作,是很有用的工具函数.而且有些时候,在笔试或面试中也会出现让你 ...
- 面试常考的常用数据结构与算法(zz)
数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考察一个人这方面的能力,把每种结 ...
- Python 标准库中的装饰器
题目描述 1.简单举例 Python 标准库中的装饰器 2.说说你用过的 Python 标准库中的装饰器 1. 首先,我们比较熟悉,也是比较常用的 Python 标准库提供的装饰器有:property ...
- (转)python标准库中socket模块详解
python标准库中socket模块详解 socket模块简介 原文:http://www.lybbn.cn/data/datas.php?yw=71 网络上的两个程序通过一个双向的通信连接实现数据的 ...
- php标准库中的优先队列SplPriorityQueue怎么使用?(继承)
php标准库中的优先队列SplPriorityQueue怎么使用?(继承) 一.总结 1.new对象,然后通过insert方法和extract方法来使用,top方法也很常用. 2.类的话首先想到继承, ...
- php标准库中QplQueue队列如何使用?
php标准库中QplQueue队列如何使用? 一.总结 1.new对象,然后通过enqueue方法和dequeue方法使用. 二.php标准库中QplQueue队列如何使用? 队列这种数据结构更简单, ...
- 用CAS操作实现Go标准库中的Once
Go标准库中提供了Sync.Once来实现"只执行一次"的功能.学习了一下源代码,里面用的是经典的双重检查的模式: // Once is an object that will p ...
- Xcode之外的文档浏览工具--Dash (在iOS代码库中浏览本帖)
链接地址:http://www.cocoachina.com/bbs/read.php?tid=273479 Xcode之外的文档浏览工具--Dash (在iOS代码库中浏览本帖) ...
随机推荐
- 使用DBMS_REDEFINITION在线切换普通表到分区表
随着数据库数据量的不断增长,有些表须要由普通的堆表转换为分区表的模式.有几种不同的方法来对此进行操作.诸如导出表数据,然后创建分区表再导入数据到分区表.使用EXCHANGE PARTITION方式来转 ...
- Java中的equals()和hashCode()
概述 在我们使用类集框架(比方使用hashMap.hashSet)的时候,常常会涉及到重写equals()和hashCode()这两个方法. 这两个方法的联系是: 1. 假设两个对象不同,那么他们的h ...
- 使用Jsoup解析和操作HTML
jsoup 简单介绍 jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套很省力的API,可通过DOM.CSS以及类似于jQuery的操作方法来取 ...
- JavaScript设计模式 Item9 --适配器模式Adapter
适配器模式(转换器面模式),通常是为要使用的接口,不符本应用或本系统使用,而需引入的中间适配层类或对象的情况. 适配器模式的作用是解决两个软件实体间的接口不兼容的问题. 一.定义 适配器模式(Adap ...
- JAVA实现RSA加密解密 非对称算法
首先RSA是一个非对称的加密算法.所以在使用该算法加密解密之前,必须先行生成密钥对.包含公钥和私钥 JDK中提供了生成密钥对的类KeyPairGenerator,实比例如以下: public stat ...
- oc 和swift混编的时候打包ipa安装不了
做了一个oc项目.里面实用到swift第三方,真机执行的时候是正常的,用企业级证书打包成ipa之后安装完毕之后闪退.通过导出手机log日志发现错误提示: Dyld Error Message: L ...
- Java程序学习中各阶段的建议
第一部分:对于尚未做过Java工作的同学,包括一些在校生以及刚准备转行Java的同学. 一.Java基础 首先去找一个Java的基础教程学一下,这里可以推荐一个地址,或者你也可以参照这个地址上去找相应 ...
- 数据分析在web交互设计中的作用 页面跳出率 100% 原因分析
通过分析访问的路径,发现,访问者访问其他页面,直接跳出 页面跳出率 100% 说明: 连作者都发现的导航路径不清晰 对导航进行改版:清晰.明了
- How to use eclipse quickly
--> // TODO Quickly find outstanding event 快速查找未完成事件 eg: // TODO Robin --> Templates ...
- 【POJ 1995】 Raising Modulo Numbers
[题目链接] http://poj.org/problem?id=1995 [算法] 快速幂 [代码] #include <algorithm> #include <bitset&g ...