Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

std::partition_point

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