C++11 で導入されたstd::partition_pointはラムダ式を渡すときに
lower_bound,upper_boundに比べて引数が一つ少なくて済むというメリットがある。
const std::vector<int> v = { -50, -20, -10, -7, -1, -2, 21, 22, 26, 27 }; const int val1 = 21; // lower_bound // 21以上の値が現れる最初の位置 auto it1 = std::partition_point(v.begin(), v.end(), [val1](const auto& obj) { return obj < val1; }); printf("lower_bound %d\n", *(--it1)); // lower_bound -2 // upper_bound // 21より大きな値が最初に現れる位置 auto it2 = std::partition_point(v.begin(), v.end(), [val1](const auto& obj) { return obj <= val1; }); printf("upper_bound %d\n", *(--it2)); // upper_bound 21 const int val2 = 20; // lower_bound // 20以上の値が最初に現れる最初の位置 auto it3 = std::partition_point(v.begin(), v.end(), [val2](const auto& obj) { return obj < val2; }); printf("lower_bound %d\n", *(--it3)); // lower_bound -2 // upper_bound // 20より大きな値が最初に現れる位置 auto it4 = std::partition_point(v.begin(), v.end(), [val2](const auto& obj) { return obj <= val2; }); printf("upper_bound %d\n", *(--it4)); // upper_bound -2