## 14.6 順序付きシーケンスのマージ

アルゴリズム `merge()` は、2 つの順序付きシーケンスを組み合わせて、新規の順序付きシーケンスを作成します。結果のサイズは、2 つの引数シーケンスのサイズの合計となります。これは、両方の集合で重複する要素を削除する `set_union()` 演算とは対照的です。`set_union()` 関数については、この章の後の節で説明します。

マージ操作は安定しています。つまり、2 つの範囲にある等価要素について、各範囲の値の相対順序が保持されるだけでなく、最初の範囲の値は常に第 2 の範囲の要素に先行します。2 つの範囲は反復子の対で定義され、結果は単一の出力反復子によって定義されます。引数は、次のように宣言されます。

    OutputIterator merge (InputIterator first1, InputIterator last1,
       InputIterator first2, InputIterator last2,
       OutputIterator result [, Compare ]);

次のプログラム例は、単純マージ、インサータによるマージの使用方法、出力ストリーム反復子によるマージの使用方法を説明しています。

    void merge_example ()
       // マージアルゴリズムの使用方法を説明する
       // 完全なソースコードについては alg7.cpp を参照

    {
          // 10 の乱数からなる list と vector を作成する
       vector<int> aVec(10);
       list<int> aList(10, 0);
       generate (aVec.begin(), aVec.end(), randomValue);
       sort (aVec.begin(), aVec.end());
       generate_n (aList.begin(), 10, randomValue);
       aList.sort();

          // ベクトルにマージする
       vector<int> vResult (aVec.size() + aList.size());
       merge (aVec.begin(), aVec.end(), aList.begin(), aList.end(),
          vResult.begin());

          // リストにマージする
       list<int> lResult;
       merge (aVec.begin(), aVec.end(), aList.begin(), aList.end(),
          inserter(lResult, lResult.begin()));

          // 出力にマージする
       merge (aVec.begin(), aVec.end(), aList.begin(), aList.end(),
          ostream_iterator<int,char> (cout, " "));
       cout << endl;

    }

アルゴリズム `inplace_merge()` (13.4.6 節) を使用して、単一シーケンスの 2 つのセクションを 1 つのシーケンスにマージすることができます。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月