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

📅  最后修改于: 2023-12-03 15:29:50.080000             🧑  作者: Mango

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

stable_partition()是C ++ STL中的一个算法函数,它可用于将序列分成两个部分,其中一个部分满足给定条件谓词,而另一个部分则不满足该条件谓词。同时,它可以保持原有的序列中元素的相对位置。


函数原型

下面是stable_partition()函数的函数原型:

template< class BidirIt, class UnaryPredicate >
BidirIt stable_partition( BidirIt first, BidirIt last, UnaryPredicate p );

参数列表如下:

  • first:要排序的序列的开始位置的迭代器(包括)
  • last:要排序的序列的结束位置的迭代器(不包括)
  • p:谓词,用于将序列分成两个部分

功能描述

stable_partition()函数通过按照谓词p所给出的条件,将序列[first, last)中满足条件p的元素放在序列的前面,不满足条件的元素放在后面。更具体地说,函数会将序列分为两个区间,第一个区间的所有元素都满足条件p,第二个区间的所有元素都不满足该条件,并且它们保持序列中原有元素的顺序不变。

函数返回位置p(x)不满足的第一个元素的迭代器。这意味着,所有在此之前的元素都满足条件,所有在此之后的元素都不满足该条件。


示例程序

下面是一个示例程序,它演示了如何使用stable_partition()函数。在本例中,我们使用了一个谓词函数,该函数检查给定数字是否为奇数。函数stable_partition()将数组分成两个部分,一个部分包含所有的奇数,另一个部分包含所有的偶数。

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

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

int main()
{
  vector<int> v{ 2, 3, 1, 2, 5, 10, 7, 8, 5, 9 };

  cout << "Original vector : ";
  for (auto i : v) { cout << i << " "; }

  // Using stable_partition() 
  auto it = stable_partition(v.begin(), v.end(), odd);

  cout << "\nPartitioned vector : ";
  for (auto i : v) { cout << i << " "; }

  cout << "\nFirst part of partitioned vector : ";
  for (auto i = v.begin(); i != it; ++i) { cout << *i << " "; }

  cout << "\nSecond part of partitioned vector : ";
  for (auto i = it; i != v.end(); ++i) { cout << *i << " "; }

  return 0;
}

下面是上面程序的输出:

Original vector : 2 3 1 2 5 10 7 8 5 9
Partitioned vector : 3 1 5 7 5 9 2 2 10 8
First part of partitioned vector : 3 1 5 7 5 9
Second part of partitioned vector : 2 2 10 8

可以看到,stable_partition()函数将序列分成了两个部分,其中一个部分包含所有的奇数,另一个部分包含所有的偶数,并且它们保持了原有的序列中元素的相对位置。


适用范围

stable_partition()函数可用于所有双向迭代器。它遵守C++ STL中的迭代器随机访问等级要求。 它还遵守输入、输出迭代器的要求。


总结

stable_partition()函数是一个非常有用的函数,它可用于将序列分成两个部分,其中一个部分满足给定条件谓词,而另一个部分则不满足该条件谓词。同时,它可以保持原有的序列中元素的相对位置。