std:: is_partitioned
|
定义于头文件
<algorithm>
|
||
|
template
<
class
InputIt,
class
UnaryPred
>
bool is_partitioned ( InputIt first, InputIt last, UnaryPred p ) ; |
(1) |
(C++11 起)
(C++20 起为 constexpr) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
UnaryPred
>
bool
is_partitioned
(
ExecutionPolicy
&&
policy,
|
(2) | (C++17 起) |
[
first
,
last
)
是否按谓词
p
进行了分区:所有满足
p
的元素都出现在不满足的元素之前。
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> 为 true 。 |
(C++20 前) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> 为 true 。 |
(C++20 起) |
目录 |
参数
| first, last | - | 定义待检验元素范围的迭代器对 |
| policy | - | 要使用的执行策略 |
| p | - |
一元谓词,对于期望在范围起始处找到的元素应返回
true
表达式
p
(
v
)
必须可转换为
bool
,其中
|
| 类型要求 | ||
-
InputIt
必须满足
LegacyInputIterator
的要求。
|
||
-
ForwardIt
必须满足
LegacyForwardIterator
的要求,且其值类型必须可转换为
UnaryPred
的参数类型。
|
||
-
UnaryPred
必须满足
Predicate
的要求。
|
||
返回值
若范围
[
first
,
last
)
中的元素
e
相对于表达式
p
(
e
)
满足
划分条件
,则返回
true
,否则返回
false
。
复杂度
最多应用 std:: distance ( first, last ) 次 p 。
异常
带有名为
ExecutionPolicy
模板参数的重载按以下方式报告错误:
-
如果作为算法一部分调用的函数执行抛出异常,且
ExecutionPolicy是某个 标准策略 ,则调用 std::terminate 。对于其他任何ExecutionPolicy,其行为由实现定义。 - 如果算法无法分配内存,则抛出 std::bad_alloc 。
可能的实现
template<class InputIt, class UnaryPred> bool is_partitioned(InputIt first, InputIt last, UnaryPred p) { for (; first != last; ++first) if (!p(*first)) break; for (; first != last; ++first) if (p(*first)) return false; return true; } |
示例
#include <algorithm> #include <array> #include <iostream> 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::cout.setf(std::ios_base::boolalpha); std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' '; std::partition(v.begin(), v.end(), is_even); std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' '; std::reverse(v.begin(), v.end()); std::cout << std::is_partitioned(v.cbegin(), v.cend(), is_even) << ' '; std::cout << std::is_partitioned(v.crbegin(), v.crend(), is_even) << '\n'; }
输出:
false true false true
参见
|
将元素范围划分为两组
(函数模板) |
|
|
(C++11)
|
定位已划分范围的分割点
(函数模板) |
|
(C++20)
|
判断范围是否按给定谓词划分
(算法函数对象) |