みさご解体新書

ソート済み配列の探索

一致

#include <bits/stdc++.h>

using namespace std;

int main() {
  vector<int> v = {2, 2, 5, 5, 9};
  cout << binary_search(v.begin(), v.end(), 1) << endl;  // 0
  cout << binary_search(v.begin(), v.end(), 2) << endl;  // 1
  cout << binary_search(v.begin(), v.end(), 3) << endl;  // 0
  cout << binary_search(v.begin(), v.end(), 4) << endl;  // 0
  cout << binary_search(v.begin(), v.end(), 5) << endl;  // 1
}

昇順でソート済みの配列に対して二分探索を行い、検索する値が存在するかを確かめる。

未満~以上の間

#include <bits/stdc++.h>

using namespace std;

int main() {
  vector<int> v = {2, 2, 5, 5, 9};
  cout << lower_bound(v.begin(), v.end(), 1) - v.begin() << endl;  // 0
  cout << lower_bound(v.begin(), v.end(), 2) - v.begin() << endl;  // 0
  cout << lower_bound(v.begin(), v.end(), 3) - v.begin() << endl;  // 2
  cout << lower_bound(v.begin(), v.end(), 4) - v.begin() << endl;  // 2
  cout << lower_bound(v.begin(), v.end(), 5) - v.begin() << endl;  // 2
  cout << lower_bound(v.begin(), v.end(), 6) - v.begin() << endl;  // 4
}
# 1
| 2 2 5 5 9

# 2
| 2 2 5 5 9

# 3
2 2 | 5 5 9

# 4
2 2 | 5 5 9

# 5
2 2 | 5 5 9

# 6
2 2 5 5 | 9

昇順でソート済みの配列に対して二分探索を行い、検索する値未満の数が左側に、以上の数が右側にくる位置をイテレータとして返す。

以下~より大きいの間

#include <bits/stdc++.h>

using namespace std;

int main() {
  vector<int> v = {2, 2, 5, 5, 9};
  cout << upper_bound(v.begin(), v.end(), 1) - v.begin() << endl;  // 0
  cout << upper_bound(v.begin(), v.end(), 2) - v.begin() << endl;  // 2
  cout << upper_bound(v.begin(), v.end(), 3) - v.begin() << endl;  // 2
  cout << upper_bound(v.begin(), v.end(), 4) - v.begin() << endl;  // 2
  cout << upper_bound(v.begin(), v.end(), 5) - v.begin() << endl;  // 4
  cout << upper_bound(v.begin(), v.end(), 6) - v.begin() << endl;  // 4
}
# 1
| 2 2 5 5 9

# 2
2 2 | 5 5 9

# 3
2 2 | 5 5 9

# 4
2 2 | 5 5 9

# 5
2 2 5 5 | 9

# 6
2 2 5 5 | 9

昇順でソート済みの配列に対して二分探索を行い、検索する値以下の数が左側に、より大きい数が右側にくる位置をイテレータとして返す。