事情是这样发生的: 二分查找总是要用到一个函数叫做lower_bound() 但是网上只告诉你怎么用(我是真佛(服)了) 例如:
int a={1,2,3,4,5,6,7}; int n=7; int c=lower_bound(a,a+n,4)-a; printf("%d",c); //lowerbound()函数查找第一个大于等于所要查找的元素的地址接着会给你一个结果:
这个程序会输出3,也就是4这个数在a数组的下标 看到这种短的**的解析,我真的人都裂开来,根本就是照本宣科啊喂!!
好了那么通过我们的疑问三连,就发现这个事情没有想象中这么简单
那么接下来的内容…
三个参数! 第一个参数:是你要搜索的东西的头指针的位置(包含头指针的位置)
第二个参数:是你要搜索的东西的尾指针的位置(不包含尾指针的位置) 那么第一个和第二个参数是用来锁定搜索位置的(好中二的说法 ) 其实就是左闭右开的指针集合了 用数学方法来写:设头指针为F,设尾指针为E 那么范围其实就是 [F,E) 了
第三个参数:是你要搜索的元素值 我们吧这个要搜索的元素值设为X
那么函数就变成了以下这个样子: lower_bound(F,E,X) 是不是很简单??嘿嘿嘿(叉腰)
其实返回值就是一个迭代器!所谓的迭代器就是指针!! 不过在c++中,有了容器这个概念,每个容器都包装了自己的迭代器 其实迭代器和结构体指针差不多,反正本质就是指针而已! 这个指针会指向第一个大于等于所要查找的元素的地址!!!
好了冷静一下,你问题的关键是没有充够钱 很明显这个函数会返回一个指针 那么众所周知 ,数组的名字就是指向数组第一个元素头地址的指针!! 那么问题又来了,指针-指针=?????? (我真是被这个问题弄醉了) 先给结论!!(好像也就只能给结论了)
那么你问我为什么!我怎么知道 其实是编译器的问题,就像指针减1,它不是减1,而是向前步进一个它的步长(指针类型所占的字节数,比如int占4个字节)。 (其实就是自己实力不够,只能拿编译器当借口 ,大家看懂就好!!)
慢着!!!!! 那么指针+指针呢? 其实那是无意义的。为什么呢? 就比如成绩排名 小明排第10名 你排第20名 20-10=10是你和小明的差距 但是20+10=30呢??? 很明显,毫无意义!!!
那么我们学完这个就可以触类旁通 地发现,vector在里面是如何运作的
vector <int> v; //这里的2233是随便一个整数 int p=lower_bound(v.begin(),v.end(),2233)-v.begin(); //注意这个v.begin(),和数组名字是异曲同工之妙!!好了,虽然其实并没有本质上解决掉“为什么指针-指针=两个指针的间距(隔几个元素)”这个问题,但是至少我们解决了为什么要减数组名这个问题! 最后!代码的路上,我们永远同在!谢谢观看! 如果有巨佬知道为什么是这样的话,我很欢迎你的留言!