C++進階:STL演算法9--邊界

weixin_34248118發表於2018-03-30

1. 簡介

邊界函式必須先排序,才能使用

函式 作用 文件
lower_bound(beg,end,val) 在[beg,end)範圍內的可以插入val而不破壞容器順序的第一個位置,返回一個ForwardIterator lower_bound()
lower_bound(beg,end,val,comp) 使用函式comp代替比較操作符執行lower_bound() lower_bound()
upper_bound(beg,end,val) 在[beg,end)範圍內插入val而不破壞容器順序的最後一個位置,該位置標誌一個大於val的值,返回一個ForwardIterator upper_bound()
upper_bound(beg,end,val,comp) 使用函式comp代替比較操作符執行upper_bound() upper_bound()
equal_range(beg,end,val) 返回一對iterator,第一個表示lower_bound,第二個表示upper_bound equal_range()
equal_range(beg,end,val,comp) 使用函式comp代替比較操作符執行lower_bound() equal_range()

2. 示例程式碼

  • lower_bound/upper_bound
// lower_bound/upper_bound example
#include <iostream>     // std::cout
#include <algorithm>    // std::lower_bound, std::upper_bound, std::sort
#include <vector>       // std::vector

int main () {
  int myints[] = {10,20,30,30,20,10,10,20};
  std::vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20

  std::sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30

  std::vector<int>::iterator low,up;
  low=std::lower_bound (v.begin(), v.end(), 20); //          ^
  up= std::upper_bound (v.begin(), v.end(), 20); //                   ^

  std::cout << "lower_bound at position " << (low- v.begin()) << '\n';
  std::cout << "upper_bound at position " << (up - v.begin()) << '\n';

  return 0;
}
  • equal_range
// equal_range example
#include <iostream>     // std::cout
#include <algorithm>    // std::equal_range, std::sort
#include <vector>       // std::vector

bool mygreater (int i,int j) { return (i>j); }

int main () {
  int myints[] = {10,20,30,30,20,10,10,20};
  std::vector<int> v(myints,myints+8);                         // 10 20 30 30 20 10 10 20
  std::pair<std::vector<int>::iterator,std::vector<int>::iterator> bounds;

  // using default comparison:
  std::sort (v.begin(), v.end());                              // 10 10 10 20 20 20 30 30
  bounds=std::equal_range (v.begin(), v.end(), 20);            //          ^        ^

  // using "mygreater" as comp:
  std::sort (v.begin(), v.end(), mygreater);                   // 30 30 20 20 20 10 10 10
  bounds=std::equal_range (v.begin(), v.end(), 20, mygreater); //       ^        ^

  std::cout << "bounds at positions " << (bounds.first - v.begin());
  std::cout << " and " << (bounds.second - v.begin()) << '\n';

  return 0;
}

3. 練習

相關文章