The C++ function is_partitioned is employed to verify if a specified range [first, last) is partitioned based on a given predicate. Essentially, this means that all elements in the range that meet the predicate criteria are positioned at the start of the sequence.
If the range is empty then it returns true.
Syntax
template <class InputIterator, class UnaryPredicate>
bool is_partitioned (InputIterator first, InputIterator last, UnaryPredicate pred);
Parameter
An input iterator that references the initial element within the specified range.
last: An input iterator that points to the element just beyond the end of the specified range.
pred : A custom unary predicate function created by the user, which evaluates to true for elements anticipated to appear at the start of the specified range.
Return value
This function will return true if the range is either empty or divided by the specified predicate pred, otherwise it will return false.
Complexity
The complexity increases linearly within the specified range [first, last), as it calls the pred function for each element until a discrepancy is encountered.
Data races
The elements within the range [first, last) are being retrieved.
Each element is accessed exactly once.
Exceptions
This function will raise an exception if either pred or any operation on the iterator results in an exception.
Please be aware that supplying invalid parameters can result in undefined behavior.
Example 1
Let's explore a basic example to showcase the functionality of the is_partitioned function:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> 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?"<<endl;
// Is it divided into an even group and an odd group?
if (is_partitioned(v.begin(), v.end(), pred)) {
cout << "Yes,It is Partitioned" << endl;
}
else {
cout << "No,It is not Partitioned" << endl;
}
return 0;
}
Output:
Before Partition: 1 2 3 4 5
After partition : 4 2 3 1 5
Is it partitioned?
Yes,It is Partitioned
Example 2
Let's see another simple example:
#include <iostream>
#include <algorithm>
#include <vector>
// Defining the BinaryFunction
bool pred(int a)
{
return (a % 2 == 0);
}
using namespace std;
int main()
{
// Declaring first vector
vector<int> 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;
}
Output:
All the even no. are present before odd no.
All the even no. are not present before odd no.
Example 3
Let's see another simple example:
#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);
}
Output:
false true false
Example 4
Let's see another simple example:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> 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?"<<endl;
// Is it divided into an even group and an odd group?
if (is_partitioned(v.begin(), v.end(), pred)) {
cout << "Yes, It is Partitioned." << endl;
}
else {
cout << "No, It is not Partitioned." << endl;
}
return 0;
}
Output:
Before Partition: 11 2 3 4 15 12
After partition: 4 2 3 11 15 12
Is it partitioned?
Yes, It is Partitioned.