function template
<algorithm>

std::is_partitioned

template <class InputIterator, class UnaryPredicate>  bool is_partitioned (InputIterator first, InputIterator last, UnaryPredicate pred);
测试范围是否已分区
如果范围内所有满足 pred 返回 true 的元素都位于那些 pred 返回 false 的元素之前,则返回 true

如果范围为空,函数返回 true

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
11
12
template <class InputIterator, class UnaryPredicate>
  bool is_partitioned (InputIterator first, InputIterator last, UnaryPredicate pred)
{
  while (first!=last && pred(*first)) {
    ++first;
  }
  while (first!=last) {
    if (pred(*first)) return false;
    ++first;
  }
  return true;
}

参数

first, last
输入迭代器,指向序列的初始和最终位置。使用的范围是 [first,last),包含 first 指向的元素以及 first 和 last 之间的所有元素,但不包含 last 指向的元素。
pred
一元函数,接受范围中的元素作为参数,并返回一个可转换为 bool 的值。返回的值指示元素是否属于第一组(如果为 true,则该元素预期在所有返回 false 的元素之前)。
该函数不得修改其参数。
这可以是一个函数指针或一个函数对象。

返回值

如果范围内所有满足 pred 返回 true 的元素都位于那些 pred 返回 false 的元素之前,则返回 true
否则返回 false

如果范围为空,函数返回 true

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// is_partitioned example
#include <iostream>     // std::cout
#include <algorithm>    // std::is_partitioned
#include <array>        // std::array

bool IsOdd (int i) { return (i%2)==1; }

int main () {
  std::array<int,7> foo {1,2,3,4,5,6,7};

  // print contents:
  std::cout << "foo:"; for (int& x:foo) std::cout << ' ' << x;
  if ( std::is_partitioned(foo.begin(),foo.end(),IsOdd) )
    std::cout << " (partitioned)\n";
  else
    std::cout << " (not partitioned)\n";

  // partition array:
  std::partition (foo.begin(),foo.end(),IsOdd);

  // print contents again:
  std::cout << "foo:"; for (int& x:foo) std::cout << ' ' << x;
  if ( std::is_partitioned(foo.begin(),foo.end(),IsOdd) )
    std::cout << " (partitioned)\n";
  else
    std::cout << " (not partitioned)\n";

  return 0;
}

可能的输出
foo: 1 2 3 4 5 6 7 (not partitioned)
foo: 1 7 3 5 4 6 2 (partitioned)


复杂度

最多线性于 firstlast 之间的 距离:对每个元素调用 pred,直到找到不匹配为止。

数据竞争

范围 [first,last) 中的一些(或全部)对象被访问(最多一次)。

异常

如果 pred 或迭代器操作抛出异常,则抛出异常。
请注意,无效的参数会导致 *未定义行为*。

另见