merge() in C++ STL

19 Sep, 2018
C++ offers in its STL library a merge() which is quite useful to merge sort two containers into a single container.It is defined in header “algorithm“. It is implemented in two ways.
Syntax 1 : Using operator “<"
Template :
template 
  outiter merge (initer1 beg1, initer1 end1,
                        initer2 beg2, initer2 end2,
                        outiter res)

Parameters :
beg1 :  Input iterator to initial position of first sequence.
end1 :  Input iterator to final position of first sequence.

beg2 :  Input iterator to initial position of second sequence.
end2 :  Input iterator to final position of second sequence.

res : Output Iterator to initial position of resultant container.
Return value : 
Iterator to last element of the resulting container.

// C++ code to demonstrate the working of// merge() implementation 1  #include <bits/stdc++.h>using namespace std;  int main(){    // initializing 1st container    vector<int> arr1 = { 1, 4, 6, 3, 2 };      // initializing 2nd container    vector<int> arr2 = { 6, 2, 5, 7, 1 };      // declaring resultant container    vector<int> arr3(10);      // sorting initial containers    sort(arr1.begin(), arr1.end());    sort(arr2.begin(), arr2.end());      // using merge() to merge the initial containers    merge(arr1.begin(), arr1.end(), arr2.begin(), arr2.end(), arr3.begin());      // printing the resultant merged container    cout << "The container after merging initial containers is : ";      for (int i = 0; i < arr3.size(); i++)        cout << arr3[i] << " ";    return 0;}
Output:
The container after merging initial containers is : 1 1 2 2 3 4 5 6 6 7 

Syntax 2 : Using comparator function
Template :
template 
  outiter merge (initer1 beg1, initer1 end1,
                        initer2 beg2, initer2 end2,
                        outiter res, Compare comp)

Parameters :
beg1 :  Input iterator to initial position of first sequence.
end1 :  Input iterator to final position of first sequence.

beg2 :  Input iterator to initial position of second sequence.
end2 :  Input iterator to final position of second sequence.

res : Output Iterator to initial position of resultant container.
comp : The comparator function that returns a boolean
true/false of the each elements compared. This function 
accepts two arguments. This can be function pointer or 
function object and cannot change values.
Return value : 
Iterator to last element of the resulting container.

// C++ code to demonstrate the working of// merge() implementation 2  #include <bits/stdc++.h>using namespace std;  // comparator function to reverse merge sortstruct greaters {    bool operator()(const long& a, const long& b) const    {        return a > b;    }};  int main(){    // initializing 1st container    vector<int> arr1 = { 1, 4, 6, 3, 2 };      // initializing 2nd container    vector<int> arr2 = { 6, 2, 5, 7, 1 };      // declaring resultant container    vector<int> arr3(10);      // sorting initial containers    // in descending order    sort(arr1.rbegin(), arr1.rend());    sort(arr2.rbegin(), arr2.rend());      // using merge() to merge the initial containers    // returns descended merged container    merge(arr1.begin(), arr1.end(), arr2.begin(), arr2.end(), arr3.begin(), greaters());      // printing the resultant merged container    cout << "The container after reverse merging initial containers is : ";      for (int i = 0; i < arr3.size(); i++)        cout << arr3[i] << " ";    return 0;}
Output :
The container after reverse merging initial containers is : 7 6 6 5 4 3 2 2 1 1 

Possible application : The merge function can be used to make a single stack of two stacks available in sorted order. These can be stack of books or notes. Let us discuss a simple example that merge orders two stack of notes in ascending order into one on basis of its value.
// C++ code to demonstrate the application of// merge() stacking notes  #include <bits/stdc++.h>using namespace std;  int main(){    // initializing 1st container    // containing denominations    vector<int> stack1 = { 50, 20, 10, 100, 2000 };      // initializing 2nd container    // containing demonitions    vector<int> stack2 = { 500, 2000, 10, 100, 50 };      // declaring resultant stack    vector<int> stack3(10);      cout << "The original 1st stack : ";    for (int i = 0; i < 5; i++)        cout << stack1[i] << " ";      cout << endl;      cout << "The original 2nd stack : ";    for (int i = 0; i < 5; i++)        cout << stack2[i] << " ";      cout << endl;      // sorting initial stacks of notes    // in descending order    sort(stack1.begin(), stack1.end());    sort(stack2.begin(), stack2.end());      // using merge() to merge the initial stacks    // of notes    merge(stack1.begin(), stack1.end(), stack2.begin(), stack2.end(), stack3.begin());      // printing the resultant stack    cout << "The resultant stack of notes is : ";      for (int i = 0; i < stack3.size(); i++)        cout << stack3[i] << " ";    return 0;}
Output :
The original 1st stack : 50 20 10 100 2000 
The original 2nd stack : 500 2000 10 100 50 
The resultant stack of notes is : 10 10 20 50 50 100 100 500 2000 2000 

This article is contributed by Manjeet Singh. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
ankush_953
array-merge
cpp-algorithm-library
STL
C++
STL
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.