📅  最后修改于: 2020-10-17 04:25:16             🧑  作者: Mango
C++ STL algorithm.is_partitioned()用于测试是否根据谓词对范围[first,last)进行了分区。换句话说,满足谓词范围内的所有元素都在序列的开头。
如果范围为空,则返回true。
template
bool is_partitioned (InputIterator first, InputIterator last, UnaryPredicate pred);
first:指向范围中第一个元素的输入迭代器。
last:指向范围中最后一个元素的输入迭代器。
pred:用户定义的一元谓词函数,对于预期在范围开头找到的元素,该函数返回true。
如果范围为空或被给定的谓词pred分区,则此函数返回true,否则返回false。
复杂度在[first,last)范围内是线性的:为每个元素调用pred直到发现不匹配。
访问范围为[first,last)的对象。
每个元素仅被访问一次。
如果pred或迭代器上的操作引发异常,则此函数引发异常。
请注意,无效的参数会导致未定义的行为。
让我们看一个简单的示例来演示is_partitioned()的用法:
#include
#include
#include
using namespace std;
int main()
{
vector v = {1, 2, 3, 4, 5};
cout<<"Before Partition: ";
for_each(v.begin(), v.end(), [](int v) {
cout << v << " ";
});
auto pred = [](int x) { return x % 2 == 0; };
// Divide it into an even group and an odd group
partition(v.begin(), v.end(), pred);
cout<<"\nAfter partition : ";
for_each(v.begin(), v.end(), [](int x) {
cout << x << " ";
});
cout<<"\n\nIs it partitioned?"<
输出:
Before Partition: 1 2 3 4 5
After partition : 4 2 3 1 5
Is it partitioned?
Yes,It is Partitioned
让我们看另一个简单的例子:
#include
#include
#include
// Defining the BinaryFunction
bool pred(int a)
{
return (a % 2 == 0);
}
using namespace std;
int main()
{
// Declaring first vector
vector v1 = { 2, 4, 6, 3, 5, 7, 9 };
// Using std::is_partitioned
bool b = std::is_partitioned(v1.begin(), v1.end(), pred);
if (b == 1) {
cout << "All the even no. are present before odd no.";
} else {
cout << "All the even no. are not present before odd no.";
}
// Inserting an even no. at the end of v1
// so std::is_partitioned returns false
v1.push_back(16);
// Now again using std::is_partitioned
b = std::is_partitioned(v1.begin(), v1.end(), pred);
if (b == 1) {
cout << "\nAll the even no. are present before odd no.";
} else {
cout << "\nAll the even no. are not present before odd no.";
}
return 0;
}
输出:
All the even no. are present before odd no.
All the even no. are not present before odd no.
让我们看另一个简单的例子:
#include
#include
#include
int main()
{
std::array 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
让我们看另一个简单的例子:
#include
#include
#include
using namespace std;
int main()
{
vector v = {11, 2, 3, 4, 15, 12};
cout<<"Before Partition: ";
for_each(v.begin(), v.end(), [](int v) {
cout << v << " ";
});
auto pred = [](int x) { return x < 10; };
// Divide it into an even group and an odd group
partition(v.begin(), v.end(), pred);
cout<<"\nAfter partition: ";
for_each(v.begin(), v.end(), [](int x) {
cout << x << " ";
});
cout<<"\n\nIs it partitioned?"<
输出:
Before Partition: 11 2 3 4 15 12
After partition: 4 2 3 11 15 12
Is it partitioned?
Yes, It is Partitioned.