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