解決lower_bound函數引申出的指針疑問(超詳細)

事情是這樣發生的:
二分查找總是要用到一個函數叫做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數組的下標
看到這種短的**的解析,我真的人都裂開來,根本就是照本宣科啊喂!!

那麼問題來了!!

1. 這個lower_bound()裏面的三個參數分別是啥?

2. 它的返回值是什麼??

3. 爲毛我減了個數組的名字就出來了下標了???

好了那麼通過我們的疑問三連,就發現這個事情沒有想象中這麼簡單

那麼接下來的內容…

指針警告!!! 指針警告!!! 指針警告!!!

先解答第一個問題!(三個參數是啥!)

三個參數!
第一個參數:是你要搜索的東西的頭指針的位置(包含頭指針的位置)

第二個參數:是你要搜索的東西的尾指針的位置不包含尾指針的位置)
那麼第一個和第二個參數是用來鎖定搜索位置的(好中二的說法
其實就是左閉右開的指針集合了
用數學方法來寫:設頭指針爲F,設尾指針爲E
那麼範圍其實就是 [F,E)

第三個參數:是你要搜索的元素值
我們吧這個要搜索的元素值設爲X

那麼函數就變成了以下這個樣子:
lower_bound(F,E,X)
是不是很簡單??嘿嘿嘿(叉腰)

再解答第二個問題!(返回值是啥!)

其實返回值就是一個迭代器!所謂的迭代器就是指針!!
不過在c++中,有了容器這個概念,每個容器都包裝了自己的迭代器
其實迭代器和結構體指針差不多,反正本質就是指針而已!
這個指針會指向第一個大於等於所要查找的元素的地址!!!

最後解答第三個最關鍵的問題!!

爲什麼!!!爲什麼要減這個數組名字!!!

Why??!!??憑什麼 !!!

好了冷靜一下,你問題的關鍵是沒有充夠錢
很明顯這個函數會返回一個指針
那麼衆所周知 ,數組的名字就是指向數組第一個元素頭地址的指針!!
那麼問題又來了,指針-指針=??????
(我真是被這個問題弄醉了)
先給結論!!(好像也就只能給結論了)

指針-指針=兩個指針的間距(隔幾個元素)!!!!

那麼你問我爲什麼!我怎麼知道
其實是編譯器的問題,就像指針減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(),和數組名字是異曲同工之妙!!

好了,雖然其實並沒有本質上解決掉“爲什麼指針-指針=兩個指針的間距(隔幾個元素)”這個問題,但是至少我們解決了爲什麼要減數組名這個問題!
最後!代碼的路上,我們永遠同在!謝謝觀看!
如果有巨佬知道爲什麼是這樣的話,我很歡迎你的留言!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章