📜  C++ STL-algorithm.is_partitioned()函数(1)

📅  最后修改于: 2023-12-03 14:59:45.498000             🧑  作者: Mango

C++ STL-algorithm.is_partitioned()函数

概述

C++ STL中的algorithm库提供了is_partitioned()函数,这个函数用来检查一个序列是否被分割成了两个不同满足条件的序列。若序列被分割成两个满足条件的序列则返回true,否则返回false。is_partitioned()函数接受三个参数:待检查序列的首迭代器,待检查序列的尾迭代器和分割条件的谓词函数。

template<class InputIterator, class UnaryPredicate>
bool is_partitioned(InputIterator first, InputIterator last, UnaryPredicate pred);
参数
  • first: 待检查序列的起始迭代器。
  • last: 待检查序列的结尾迭代器。
  • pred: 分割条件的谓词函数,它接受一个参数,返回一个bool值。
返回值

如果序列被分割成两个满足条件的序列,则返回true;否则返回false。

示例

以下是is_partitioned()函数的一个例子:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

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

int main () {
  int myints[] = {1,2,3,4,5,6,7,8,9};       // myints: 1 2 3 4 5 6 7 8 9
  vector<int> v(myints,myints+9);

  vector<int>::iterator bound;
  bound = partition(v.begin(), v.end(), is_odd);  // v: 1 3 5 7 9 2 4 6 8

  if (is_partitioned(v.begin(),bound,is_odd))
    cout << "odd numbers: ";
  else
    cout << "not partitioned ";
  for (vector<int>::iterator it=v.begin(); it!=bound; ++it)
    if (is_odd(*it)) cout << *it << ' ';           // odd numbers: 1 3 5 7 9
  cout << endl;

  if (is_partitioned(bound,v.end(),is_odd))
    cout << "even numbers: ";
  else
    cout << "not partitioned ";
  for (vector<int>::iterator it=bound; it!=v.end(); ++it)
    if (!is_odd(*it)) cout << *it << ' ';          // even numbers: 2 4 6 8
  cout << endl;

  return 0;
}

在上面的例子中我们使用了一个谓词函数is_odd(),该函数检查一个整数是否为奇数。我们首先使用partition()函数将v序列分为了两个序列,一个是奇数序列,一个是偶数序列。然后我们调用is_partitioned()函数检查这两个序列是否合法。如果合法则输出序列中的奇数和偶数。注意,以上例子中is_odd()函数的定义和partition()函数的定义在algorithm库中已经提供了。

注意事项
  • 不要尝试对含有重复元素的序列使用is_partitioned()函数进行分割,该函数将返回false。
  • 谓词函数的返回值必须是布尔类型。
  • is_partitioned()函数的时间复杂度为O(n)。