#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 奇数の判定
//bool is_odd(int x) {
// return x % 2 > 0;
//}
class is_odd : public unary_function<int, bool>
{
public:
result_type operator() (argument_type k)
{
return (result_type)(k % 2);
}
};
int main()
{
// 初期設定
vector<int> v1 {1, 2, 3, 4, 5};
printf("v1 :");
for (auto x : v1)
printf(" %d", x);
printf("\n");
vector<int> v2 {1, 2, 3, 4, 5};
printf("v2 :");
for (auto x : v2)
printf(" %d", x);
printf("\n");
// v1 の奇数の要素を前に持ってくる(partition)
printf("奇数の要素を前に持ってくる(partition)\n");
partition(v1.begin(), v1.end(), is_odd()); // 単項関数オブジェクト
// partition(v1.begin(), v1.end(), is_odd); // 関数 is_odd
// partition(v1.begin(), v1.end(), [](int x){ return x%2 > 0; }); // ラムダ式
printf(" v1 :");
for (auto x : v1)
printf(" %d", x);
printf("\n");
// 区分化されているか?(is_partitioned)
printf("区分化されているか?(is_partitioned)\n");
bool b1 = is_partitioned(v1.begin(), v1.end(), is_odd());
bool b2 = is_partitioned(v2.begin(), v2.end(), is_odd());
// bool b1 = is_partitioned(v1.begin(), v1.end(), is_odd); // 関数 is_odd
// bool b2 = is_partitioned(v2.begin(), v2.end(), is_odd); // 関数 is_odd
// bool b1 = is_partitioned(v1.begin(), v1.end(), [](int x){ return x%2 > 0; }); // ラムダ式
// bool b2 = is_partitioned(v2.begin(), v2.end(), [](int x){ return x%2 > 0; }); // ラムダ式
cout << boolalpha;
cout << " v1 : " << b1 << " v2 : " << b2 << endl;
// 区分化されている箇所の次の要素(partition_point)
printf("区分化されている箇所の次の要素(partition_point)\n");
vector<int>::iterator it1 = partition_point(v1.begin(), v1.end(), is_odd());
// vector<int>::iterator it1 = partition_point(v1.begin(), v1.end(), is_odd); // 関数 is_odd
// vector<int>::iterator it1 = partition_point(v1.begin(), v1.end(), [](int x){ return x%2 > 0; }); // ラムダ式
printf(" v1 の区分化点 : %d の前\n", *it1);
vector<int>::iterator it2 = partition_point(v2.begin(), v2.end(), is_odd());
// vector<int>::iterator it2 = partition_point(v2.begin(), v2.end(), is_odd); // 関数 is_odd
// vector<int>::iterator it2 = partition_point(v2.begin(), v2.end(), [](int x){ return x%2 > 0; }); // ラムダ式
if (it2 == v2.end())
printf(" v2 は区分化されていない\n");
// v2 の奇数の要素を前に持ってくる(stable_partition)
printf("v2 の奇数の要素を前に持ってくる(stable_partition)\n");
stable_partition(v2.begin(), v2.end(), is_odd());
// stable_partition(v2.begin(), v2.end(), is_odd); // 関数 is_odd
// stable_partition(v2.begin(), v2.end(), [](int x){ return x%2 > 0; }); // ラムダ式
printf(" v2 :");
for (auto x : v2)
printf(" %d", x);
printf("\n");
// 奇数 を v3,偶数を v4 にコピー(partition_copy)
printf("奇数 を v3,偶数を v4 にコピー(partition_copy)\n");
vector<int> v {1, 2, 3, 4, 5}, v3, v4;
partition_copy(v.begin(), v.end(), back_inserter(v3), back_inserter(v4), is_odd()); // back_inserter 参照
// partition_copy(v.begin(), v.end(), back_inserter(v3), back_inserter(v4), is_odd); // 関数 is_odd
// partition_copy(v.begin(), v.end(), back_inserter(v3), back_inserter(v4), [](int x){ return x%2 > 0; }); // ラムダ式
printf(" v :");
for (auto x : v)
printf(" %d", x);
printf("\n");
printf(" v3 :");
for (auto x : v3)
printf(" %d", x);
printf("\n");
printf(" v4 :");
for (auto x : v4)
printf(" %d", x);
printf("\n");
return 0;
}