事情是這樣發生的:
二分查找總是要用到一個函數叫做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(),和數組名字是異曲同工之妙!!
好了,雖然其實並沒有本質上解決掉“爲什麼指針-指針=兩個指針的間距(隔幾個元素)”這個問題,但是至少我們解決了爲什麼要減數組名這個問題!
最後!代碼的路上,我們永遠同在!謝謝觀看!
如果有巨佬知道爲什麼是這樣的話,我很歡迎你的留言!