CodeNebula
C++20stladvanced

std::ranges::merge / inplace_merge (C++20 Addition)

C++20 · The Big Four · Compiler flag: -std=c++20

Explanation

`merge` combines two sorted ranges into a single sorted output range. `inplace_merge` merges two consecutive sorted subranges within a single range.

Real-World Scenario

Merge two pre-sorted streams of timestamped events into a unified timeline.

Quick Snippet

snippet.cpp
#include <ranges>
#include <algorithm>
#include <vector>

std::vector<int> a = {1, 3, 5}, b = {2, 4, 6};
std::vector<int> merged(6);

std::ranges::merge(a, b, merged.begin());
// merged == {1, 2, 3, 4, 5, 6}

Full Example

ranges_merge.cpp
// CodeNebula - C++20 Example: Ranges Merge
// Compile: g++ -std=c++20 -Wall -Wextra -o example ranges_merge.cpp

#include <algorithm>
#include <iostream>
#include <vector>
#include <string>

int main() {
    // ranges::merge - merge two sorted ranges into one sorted output
    std::vector<int> a = {1, 3, 5, 7, 9};
    std::vector<int> b = {2, 4, 6, 8, 10};
    std::vector<int> merged(a.size() + b.size());

    std::ranges::merge(a, b, merged.begin());
    std::cout << "A: ";
    for (int x : a) std::cout << x << ' ';
    std::cout << "\nB: ";
    for (int x : b) std::cout << x << ' ';
    std::cout << "\nMerged: ";
    for (int x : merged) std::cout << x << ' ';
    std::cout << '\n';

    // Merge with custom comparator (descending sorted inputs)
    std::vector<int> desc1 = {9, 7, 5, 3};
    std::vector<int> desc2 = {8, 6, 4, 2};
    std::vector<int> desc_merged(desc1.size() + desc2.size());

    std::ranges::merge(desc1, desc2, desc_merged.begin(),
                       std::ranges::greater{});
    std::cout << "\nDescending merge: ";
    for (int x : desc_merged) std::cout << x << ' ';
    std::cout << '\n';

    // Merge with projection
    struct Item {
        std::string name;
        int priority;
    };
    std::vector<Item> list1 = {{"Task A", 1}, {"Task C", 3}};
    std::vector<Item> list2 = {{"Task B", 2}, {"Task D", 4}};
    std::vector<Item> all(4);

    std::ranges::merge(list1, list2, all.begin(), {}, &Item::priority, &Item::priority);
    std::cout << "\nMerged by priority:\n";
    for (const auto& item : all)
        std::cout << "  " << item.name << " (pri " << item.priority << ")\n";

    // ranges::inplace_merge - merge two sorted halves within one container
    std::vector<int> data = {1, 4, 7, 10, 2, 5, 8, 11};
    std::cout << "\nBefore inplace_merge: ";
    for (int d : data) std::cout << d << ' ';
    std::cout << '\n';

    std::ranges::inplace_merge(data, data.begin() + 4);
    std::cout << "After inplace_merge:  ";
    for (int d : data) std::cout << d << ' ';
    std::cout << '\n';

    return 0;
}
Run command
g++ -std=c++20 -Wall -Wextra -o example ranges_merge.cpp