| 函數 | 回傳 | 語意 | 區間表示 |
|---|---|---|---|
binary_search | bool | 元素是否存在 | — |
lower_bound | 迭代器 | 第一個 不小於 value 的位置 (≥) | [first, last) 左閉右開 |
upper_bound | 迭代器 | 第一個 大於 value 的位置 (>) | [first, last) 左閉右開 |
對已排序陣列 {0,0,2,2,2,4,4,4,4,5}:
2:lower_bound → 指向索引 2 (第一個 2)upper_bound → 指向索引 5 (第一個 4)個數 = upper - lower = 33 (不存在):lower_bound = upper_bound = 指向索引 5 (第一個 4),可作為插入位置。// lower_bound: 第一個 >= target
int lower_bound(const vector& a, int target) {
int l = 0, r = a.size();
while (l < r) {
int mid = l + (r - l) / 2;
if (a[mid] < target) l = mid + 1;
else r = mid;
}
return l; // 可能等於 a.size() (所有元素 < target)
}
// upper_bound: 第一個 > target
int upper_bound(const vector& a, int target) {
int l = 0, r = a.size();
while (l < r) {
int mid = l + (r - l) / 2;
if (a[mid] <= target) l = mid + 1;
else r = mid;
}
return l;
}
mid = (l + r) / 2 可能溢位,改用 l + (r - l) / 2。std::lower_bound 等),經過嚴格測試、最佳化、處理邊界情況。auto range = equal_range(v.begin(), v.end(), val); 回傳 pair<it, it>,等同 {lower_bound, upper_bound},一次呼叫獲得完整相等區間。