在編寫測試測量類的儀器軟體時,一些需要用戶輸入的參數,這些參數可能只能取一些離散的數值,如頻譜儀軟體中設置解析度帶寬時,可能只能取{1、2、5、10、20、50、100}裡面的數值,這時需要將用戶輸入的1-100之內的任意數值要規整為這個數組裡面的值。如當用戶輸入8、30、50時,假設向上規整的話,程序裡面應該將其規整為10、50、50三個數值。
在C/C++語言裡面實現這個功能,上面的問題實際上可以轉化為,對於一個給定的數值,如何在一個已知的離散數組中向上查找與之相鄰的元素數值。
C++語言中的實現方法
比較簡單的方法,可以藉助於C++標準庫中的函數「lower_bound」來實現。
該函數的意義是,在first和last中的前閉後開區間進行二分查找,返回大於或等於val的第一個元素位置。如果所有元素都小於val,則返回last的位置。
對於上面的問題,其C++語言的實現代碼如下:
代碼簡要解釋如下:
第1-2行,包含的頭文件,lower_bound需要包含algorithm文件。
第7-14行,定義x數組,並在控制項臺程序中列印每個元素的值。
第17-19行,調用lower_bound函數,分別查找與a、b、c三個數值相鄰的值。其返回的是指向查找到的元素的指針。
第20-22行,列印出查找到元素的值。
其運行結果如下圖所示:
從運行結果可看出,對於要查找的數值8、30、50,可以正確找到與之相鄰的數組中的值,分別為10、50、50三個數值。
說明
與「lower_bound」函數類似的,C++標準庫中還提供了另一個函數「upper_bound」,其意義是,在first和last中的前閉後開區間進行二分查找,返回大於val的第一個元素位置。如果所有元素都小於val,則返回last的位置。
可以通過下面的例子看一下這兩個函數的區別:
程序運行結果如下圖所示:
在數組y中,lower_bound函數返回的是第一個大於等於30的值,所以位置是2,對應的值是30。而upper_bound函數返回的是第一個大於30的值,所以位置是5,對應的值是40。
另外,例子使用的編譯環境是VC6.0。
如果你覺得這篇文章對你有用的話,請不要忘記點讚哦。