参数:

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标准库中常用数据结构和算法之查找的更多相关文章

  1. STL笔记(6)标准库:标准库中的排序算法

    STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew A ...

  2. 彻底弄清c标准库中string.h里的常用函数用法

    在我们平常写的c/c++程序,一些算法题中,我们常常会用到c标准库中string.h文件中的函数,这些函数主要用于处理内存,字符串相关操作,是很有用的工具函数.而且有些时候,在笔试或面试中也会出现让你 ...

  3. 面试常考的常用数据结构与算法(zz)

    数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考察一个人这方面的能力,把每种结 ...

  4. Python 标准库中的装饰器

    题目描述 1.简单举例 Python 标准库中的装饰器 2.说说你用过的 Python 标准库中的装饰器 1. 首先,我们比较熟悉,也是比较常用的 Python 标准库提供的装饰器有:property ...

  5. (转)python标准库中socket模块详解

    python标准库中socket模块详解 socket模块简介 原文:http://www.lybbn.cn/data/datas.php?yw=71 网络上的两个程序通过一个双向的通信连接实现数据的 ...

  6. php标准库中的优先队列SplPriorityQueue怎么使用?(继承)

    php标准库中的优先队列SplPriorityQueue怎么使用?(继承) 一.总结 1.new对象,然后通过insert方法和extract方法来使用,top方法也很常用. 2.类的话首先想到继承, ...

  7. php标准库中QplQueue队列如何使用?

    php标准库中QplQueue队列如何使用? 一.总结 1.new对象,然后通过enqueue方法和dequeue方法使用. 二.php标准库中QplQueue队列如何使用? 队列这种数据结构更简单, ...

  8. 用CAS操作实现Go标准库中的Once

    Go标准库中提供了Sync.Once来实现"只执行一次"的功能.学习了一下源代码,里面用的是经典的双重检查的模式: // Once is an object that will p ...

  9. Xcode之外的文档浏览工具--Dash (在iOS代码库中浏览本帖)

    链接地址:http://www.cocoachina.com/bbs/read.php?tid=273479 Xcode之外的文档浏览工具--Dash    (在iOS代码库中浏览本帖)       ...

随机推荐

  1. LeetCode 953. Verifying an Alien Dictionary (验证外星语词典)

    题目标签:HashMap 题目给了我们一个 order 和 words array,让我们依照order 来判断 words array 是否排序. 利用hashmap 把order 存入 map, ...

  2. Nginx网站用Let’sEncrypt证书开HTTPS

  3. Eclipse自定义HTML5,JSP模板

    原文:http://blog.csdn.net/xz2585458279/article/details/78833893 我们知道在MyEclipse里面编写的html和jsp模板并不符合html5 ...

  4. 通过usb连接adb

    手机不同进入的方式可能不一样,我使用的是努比亚手机. 借鉴这里的:http://adbshell.com/commands/adb-connect 在Wi-Fi上使用ADB:adb connect & ...

  5. Django day31 contentType组件,Django的缓存

    一.contentType组件 1.干什么用的? 是一个django内置的一个组件,方便我们快速的连表操作 2.这两个字段都不会在数据库中生成,他只是用来查询,插入的 -在course表中: poli ...

  6. POJ 1873 计算几何

    思路: 二进制枚举一下要删哪些点 求个凸包,算一下贡献 //By SiriusRen #include <cmath> #include <cstdio> #include & ...

  7. 非常无聊——STD::sort VS 基数排序

    众所周知,Std::sort()是一个非常快速的排序算法,它基于快排,但又有所修改.一般来说用它就挺快的了,代码一行,时间复杂度O(nlogn)(难道不是大叫一声“老子要排序!!”就排好了么...). ...

  8. Razor的使用

    Razor可以识别尖括号,且关键词是@,默认情况下会对输出的html代码进行转义 1.C#代码 用 @ 加 中括号 包起来 @{ ; i < ; i++) { <h3>C#语句块要用 ...

  9. OpenAMP简介

    通常在AMP(非对称多处理)配置中,会采用在不同的处理核上运行不同的软件环境并执行各自的代码程序,各核心之间通力合作实现处理器性能的提升.在AMP系统中,所谓的主处理器通常是指最先启动且主要负责管理其 ...

  10. html用过标签记录

    nowrap="nowrap" //用于列表中td不许换行 maxlength="100" //用于输入框的长度限制 colspan="2" ...