partition

[機能]

  単項述語オブジェクトが真になる要素を偽になる要素の前に移動します.その際,最初の前後関係が維持されるとは限りません.

[形式]
#include <algorithm>

template <class BidirectionalIterator, class Predicate>
    Bidirectionaliterator partition(BidirectionalIterator first,
                                    BidirectionalIterator last,
                                    Predicate pred);		

[使用例]

  1. partition,stable_partition,is_partitioned,partition_point,partition_copy の使用方法です.以下に示すプログラム例において,いくつかのコメント部分は,その上または下に記述された方法とほぼ同等なものであることを示しています(複数行の対応関係である場合もある)
    #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
    			
[参照]

stable_partitionis_partitionedpartition_pointpartition_copy

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引