merge() in C++ STL

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.

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


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.

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ code to demonstrate the working of
// merge() implementation 2
  
#include <bits/stdc++.h>
using namespace std;
  
// comparator function to reverse merge sort
struct 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;
}

chevron_right


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.

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


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.



My Personal Notes arrow_drop_up

Improved By : ankush_953