#include <iostream>
#include <algorithm>
#include <array>
#include <vector>
#include <functional>
using namespace std;
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;
}
template<typename ForwardIterator,typename UnaryPredicate>
ForwardIterator __partition(ForwardIterator first,ForwardIterator last,
UnaryPredicate pred){
auto pos=first;
for(;first!=last;++first)
if(pred(*first))
swap(*first,*pos++);
return pos;
}
int main(){
array<int,8> t1 = {3,5,7,11,13,17,19,23};
array<int,8> t2 = {19,23,3,5,7,11,13,17};
__partition(t2.begin(),t2.end(),[](int i){return i<15;});
for_each(t2.begin(),t2.end(),[](int i){cout<<i<<endl;});
return 0;
}