アルゴリズム 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 つのシーケンスにマージすることができます。