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 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; } |
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.
Rated as one of the most sought after skills in the industry, own the basics of coding with our C++ STL Course and master the very concepts by intense problem-solving.