The problem is pretty simple: there is a list of time ranges for meetings and need to show the meetings as continuous block in calendar.
As per modern c++ I have used std::back_inserter_iterator for vector instead of passing vector by value or by reference. This approach is much cleaner, modern and saves a lot of copying of data compared to old style.
// i/p: [(0, 1), (3, 5), (4, 8), (10, 12), (9, 10)] // o/p: [(0, 1), (3, 8), (9, 12)] #include <iostream> #include <vector> #include <algorithm> struct Meeting; // define meeting using it = std::vector<Meeting>::iterator; // use an back inserter iterator to pass as function argument instead // of passing vector by reference or creating vector on heap using bi = std::back_insert_iterator<std::vector<Meeting>>; struct Meeting{ int start_time, end_time; // default constructor Meeting() = default; // parameterized constructor Meeting(int start_time, int end_time):start_time{start_time},end_time{end_date}{} // override < operator used for sorting. bool operator <(const Meeting &other) const{ return start_date < other.start_date; } static void merge(it start, it finish, bi merged_meeting_bi){ int start_time = start->start_time; int end_time = start->end_time; while(start < finish){ start++; if(start->start_time > end_time){ merged_meeting_bi = {start_time, end_time}; // create meeting using parameterized constructor start_time = start->start_time; end_time = start->end_time; }else{ end_time = std::max(start->end_time, end_time); } } } }; int main(){ std::vector<Meeting> meetings{{0, 1}, {3, 5}, {4, 8}, {10, 12}, {9, 10}}; std::vector<Meeting> merged_meetings; auto bi = std::back_insert_iterator<std::vector<Meeting>>(merged_meetings); auto start = meetings.begin(); auto finish = meetings.end(); // sort by first time std::sort(start, finish); for(const auto &meeting : meetings){ std::cout << meeting.start_time << ' ' << meeting.end_time << '\n'; } Meeting::merge(start, finish, bi); for(const auto & meeting: merged_meetings){ std::cout << meeting.start_time << ' ' << meeting.end_time << '\n'; } return 0; }