std::partition_point与排序范围的二分查找
std::partition_point(first, last, pred)如何工作?它和lower_bound有什么关系?在什么场景下使用partition_point比binary_search更合适?
回答
屠龙少年
std::partition_point在已分区范围([first, last)中所有满足pred的元素都在不满足pred的元素之前)中找到分区点——即首个不满足pred的元素的迭代器。使用二分查找O(log n)复杂度(随机迭代器),要求范围已按pred分区。与lower_bound关系:lower_bound(first,last,val)等价于partition_point(first,last,[val](auto& x){ return x < val; })——都是二分查找找到"第一条分界线"。适用场景:①自定义分区条件不是简单的<比较时(如按字符串长度分区);②配合is_partitioned先验证再查找;③各种二分查找变体的通用实现方式。示例:vector<int> v{1,3,5,7,2,4,6,8}; partition_point(v, [](int x){ return x%2==1; })返回指向2的迭代器。C++20的ranges版本支持投影。注意:范围必须是已分区的,否则结果未定义。