lower_bound算法要求在已經按照非遞減順序排序的數組中找到第一個大於等於給定值key的那個數,其基本實現原理是二分查找,如下所示:
int lower_bound(vector<int> arr, int key) { int half; int len = arr.size(); int mid; int first = 0; while (len > 0) { half = len >> 1; mid = first + half; //in the right part if (arr[mid] < key) { first = mid + 1; //因為first=mid+1,所以這里的len需要在減去half的基礎之上再減去1 len = len - half - 1; } else { //in the left part len = half; } } return first; }
upper_bound函數要求在按照非遞減順序排好序的數組中找到第一個大於給定值key的那個數,其基本實現原理是二分查找,具體實現如下所示:
int upper_bound(vector<int> arr, int key) { int mid; int first = 0; int len = arr.size(); int half; while (len > 0) { half = len >> 1; mid = half + first; if (arr[mid] > key) {//in the left part len = half; } else {//if arr[mid]<= key ,in the right part first = mid + 1; len = len - half - 1; } } return first; }
上述兩種實現參考了stl中的實現方式,返回滿足條件的值在數組中的下標。如果找不到滿足條件的值,將會返回數組的大小,就像迭代器中的end一樣,對應有效下標的下一個值。