参数:

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. .NET 复制A对象值到B对象

    1.最基础的ModelCopy using System; using System.Collections.Generic; using System.ComponentModel; public ...

  2. codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解

    秉承ACM团队合作的思想懒,这篇blog只有部分题解,剩余的请前往星感大神Star_Feel的blog食用(表示男神汉克斯更懒不屑于写我们分别代写了下...) C. Cloud Computing 扫 ...

  3. iOS开发】之CocoaAsyncSocket使用

    本文介绍了CocoaAsyncSocket库中GCDAsyncSocket类的使用.粘包处理以及时间延迟测试. 一.CocoaAsyncSocket介绍 CocoaAsyncSocket中主要包含两个 ...

  4. Xcode 设置图片全屏显示

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  5. AngularJS 1.x 国际化——Angular-translate例子

    可运行代码如下: <!DOCTYPE html> <html ng-app="MyApp"> <head> <meta http-equi ...

  6. 利用【监听器】动态加载Log4j配置文件

    转自:https://veromca273.iteye.com/blog/1889304 1 创建监听器: public class LogListener implements ServletCon ...

  7. 8.2 OSI模型

    OSI模型它是为了使不同的网络厂商.硬件厂商它们的系统能够良好的进行兼容,进行互连而提出来的,是由ISO(国际标准化组织在1979年公布的),它是现在的计算机网络领域的金科玉律.大家都认可的一个标准, ...

  8. vi编辑文件保存后,提示“Can't open file for writing Press ENTER or type command to continue”

    在linux上使用vi命令修改或者编辑一个文件内容的时候,最后发现使用<Esc+:+wq!>无法保存退出,却出现,如下提示: E212: Can't open file for writi ...

  9. P3379最近公共祖先(LCA)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  10. [Swift通天遁地]五、高级扩展-(5)获取互补色、渐变色、以及图片主题颜色

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...