lower_boundの挙動

あんまり使ったことがなかったので挙動の把握メモ。でかい順に並べておいて、最大のやつを取り除いたときに次にでかいのを知りたい。priority_queueでいいかなと思ったけど、最大以外のものも消えることを想定。

#include <iostream>
#include <set>

int main(int argc, char *argv[]) {
  std::set<int, std::greater<int> > s;

  s.insert(1);
  s.insert(2);
  s.insert(3);
  s.insert(4);
  s.insert(5);

  s.erase(2);

  int max_value = 5;
  s.erase(max_value);
  std::set<int>::iterator it = s.lower_bound(max_value);
  while(it != s.end()) {
	std::cout << *it << std::endl;
	it++;
  }

  return 0;
}

実行結果。

/Users/yasuhisa/cpp% g++ max_value.cpp; ./a.out
4
3
1

追記

最大のものを消したいならs.earse(s.begin())で、その後次に大きな要素を取得したい時はs.lower_bound()は使わないでs.begin()でよさげであった。