function template
<algorithm>
std::partitiontemplate <class BidirectionalIterator, class UnaryPredicate> BidirectionalIterator partition (BidirectionalIterator first, BidirectionalIterator last, UnaryPredicate pred);
template <class ForwardIterator, class UnaryPredicate> ForwardIterator partition (ForwardIterator first, ForwardIterator last, UnaryPredicate pred);
Partition range in two
Rearranges the elements from the range[first,last)
, in such a way that all the elements for which pred returns true
precede all those for which it returns false
. The iterator returned points to the first element of the second group.
The relative ordering within each group is not necessarily the same as before the call. See stable_partition for a function with a similar behavior but with stable ordering within each group.
The behavior of this function template (C++98) is equivalent to:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <class BidirectionalIterator, class UnaryPredicate>
BidirectionalIterator partition (BidirectionalIterator first,
BidirectionalIterator last, UnaryPredicate pred)
{
while (first!=last) {
while (pred(*first)) {
++first;
if (first==last) return first;
}
do {
--last;
if (first==last) return first;
} while (!pred(*last));
swap (*first,*last);
++first;
}
return first;
}
to the initial and final positions of the sequence to partition. The range used is
[first,last)
, which contains all the elements between
firstand
last1, including the element pointed by
firstbut not the element pointed by
last.
to the initial and final positions of the sequence to partition. The range used is
[first,last)
, which contains all the elements between
firstand
last, including the element pointed by
firstbut not the element pointed by
last.
shall point to a type for which
swapis defined and swaps the value of its arguments.
bool
. The value returned indicates whether the element is to be placed before (if true
, it is placed before all the elements for which it returns false
).
false
), or last if this group is empty.
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
// partition algorithm example
#include <iostream> // std::cout
#include <algorithm> // std::partition
#include <vector> // std::vector
bool IsOdd (int i) { return (i%2)==1; }
int main () {
std::vector<int> myvector;
// set some values:
for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
std::vector<int>::iterator bound;
bound = std::partition (myvector.begin(), myvector.end(), IsOdd);
// print out content:
std::cout << "odd elements:";
for (std::vector<int>::iterator it=myvector.begin(); it!=bound; ++it)
std::cout << ' ' << *it;
std::cout << '\n';
std::cout << "even elements:";
for (std::vector<int>::iterator it=bound; it!=myvector.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
odd elements: 1 9 3 7 5 even elements: 6 4 8 2
[first,last)
are modified.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4