Open In App

merge() in C++ STL

Last Updated : 14 Sep, 2022
Suggest changes
Share
Like Article
Like
Report

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.


 

CPP
// 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.


 

CPP
// 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. 

CPP
// 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 denominations  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 



Explore