#include <algorithm> template <class ForwardIterator, class Predicate> ForwardIterator partition_point(ForwardIterator first, ForwardIterator last, Predicate pred);
#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; }
v1 : 1 2 3 4 5 v2 : 1 2 3 4 5 奇数の要素を前に持ってくる(partition) v1 : 1 5 3 4 2 区分化されているか?(is_partitioned) v1 : true v2 : false 区分化されている箇所の次の要素(partition_point) v1 の区分化点 : 4 の前 v2 は区分化されていない v2 の奇数の要素を前に持ってくる(stable_partition) v2 : 1 3 5 2 4 奇数 を v3,偶数を v4 にコピー(partition_copy) v : 1 2 3 4 5 v3 : 1 3 5 v4 : 2 4
菅沼ホーム | 本文目次 | 演習問題解答例 | 付録目次 | 索引 |