std::is_partitioned

来自cppreference.com
< cpp‎ | algorithm

 
 
算法库
执行策略 (C++17)
不修改的序列操作
all_of
any_of
none_of
(C++11)
(C++11)
(C++11)
for_each
for_each_n(C++17)
修改的序列操作
未初始化存储上的操作
划分操作
is_partitioned(C++11)
partition_point(C++11)
排序操作
is_sorted(C++11)
is_sorted_until(C++11)
二分查找操作
集合操作(在已排序范围上)
堆操作
is_heap(C++11)
is_heap_until(C++11)
最小/最大操作
minmax(C++11)
minmax_element(C++11)
clamp(C++17)

重排
数值操作
C 库
 
定义于头文件 <algorithm>
template< class InputIt, class UnaryPredicate >
bool is_partitioned( InputIt first, InputIt last, UnaryPredicate p );
(C++11 起)
返回true所有元素是否满足谓词的范围内[first, last)p之前的所有元素不出现。返回true如果[first, last)是空的.
原文:
Returns true if all elements in the range [first, last) that satisfy the predicate p appear before all elements that don't. Also returns true if [first, last) is empty.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

目录

[编辑] 参数

first, last -
检查元素的范围
原文:
the range of elements to check
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
p - 一元谓词
预期的元素将被发现在该范围的开头
原文:
for the elements expected to be found in the beginning of the range
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里
返回​true.

谓词函数的签名形式如下:

 bool pred(const Type &a);

虽然函数签名中const &不是必须的,但是函数必须保证不会修改传递给它的对象。
类型 Type 必须能使 InputIt 对象能够被解引用并隐式转换为 Type. ​

类型要求
-
InputIt必须满足 InputIterator的要求。

[编辑] 返回值

true如果[first, last)为空或p进行分区。 false否则.....
原文:
true if the range [first, last) is empty or is partitioned by p. false otherwise.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 复杂度

在大多数std::distance(first, last)应用p.
原文:
At most std::distance(first, last) applications of p.
这段文字是通过 Google Translate 自动翻译生成的。
您可以帮助我们检查、纠正翻译中的错误。详情请点击这里

[编辑] 可能的实现

template< class InputIt, class UnaryPredicate >
bool is_partitioned(InputIt first, InputIt last, UnaryPredicate 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.begin(), v.end(), is_even);
}

输出:

false true false

[编辑] 另请参阅

把一个区间的元素分为两组
(函数模板) [edit]
定位已划分的区域的划分点
(函数模板) [edit]