std::partition_point
来自cppreference.com
定义于头文件 <algorithm>
|
||
template< class ForwardIt, class UnaryPredicate > ForwardIt partition_point( ForwardIt first, ForwardIt last, UnaryPredicate p ); |
(1) | (C++11 起) |
检验(如同用 std::partition 的)划分范围 [first, last)
,并定位第一划分的结尾,即首个不满足 p
的元素,或若所有元素满足 p
则为 last
。
目录 |
[编辑] 参数
first, last | - | 要检验的元素被划分范围 |
p | - | 对于在范围起始找到的元素则返回 true 的一元谓词。 谓词函数签名应等价于如下者: bool pred(const Type &a); 签名不必拥有 const & ,但函数必须不修改传递给它的对象。 |
类型要求 | ||
-ForwardIt 必须满足 ForwardIterator 的要求。
| ||
-UnaryPredicate 必须满足 Predicate 的要求。
|
[编辑] 返回值
[first, last)
内第一划分结尾后的迭代器,或若所有元素满足 p
则为 last
。
[编辑] 复杂度
给定 N = std::distance(first, last) ,进行 O(log N) 次谓词 p
的应用。
然而,对于非随机访问迭代器 (RandomAccessIterator
) ,迭代器自增次数为 O(N) 。
[编辑] 示例
运行此代码
#include <algorithm> #include <array> #include <iostream> #include <iterator> int main() { std::array<int, 9> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; auto is_even = [](int i){ return i % 2 == 0; }; std::partition(v.begin(), v.end(), is_even); auto p = std::partition_point(v.begin(), v.end(), is_even); std::cout << "Before partition:\n "; std::copy(v.begin(), p, std::ostream_iterator<int>(std::cout, " ")); std::cout << "\nAfter partition:\n "; std::copy(p, v.end(), std::ostream_iterator<int>(std::cout, " ")); }
输出:
Before partition: 8 2 6 4 After partition: 5 3 7 1 9
[编辑] 参阅
(C++11) |
检查区间元素是否按升序排列 (函数模板) |
返回指向第一个不小于给定值的元素的迭代器 (函数模板) |