std::inplace_merge

Header: <algorithm>

Merges two consecutive sorted ranges [first,middle) and [middle,last) into one sorted range [first,last).

# Declarations

template< class BidirIt >
void inplace_merge( BidirIt first, BidirIt middle, BidirIt last );

(constexpr since C++26)

template< class ExecutionPolicy, class BidirIt >
void inplace_merge( ExecutionPolicy&& policy,
BidirIt first, BidirIt middle, BidirIt last );

(since C++17)

template< class BidirIt, class Compare >
void inplace_merge( BidirIt first, BidirIt middle, BidirIt last,
Compare comp );

(constexpr since C++26)

template< class ExecutionPolicy, class BidirIt, class Compare >
void inplace_merge( ExecutionPolicy&& policy,
BidirIt first, BidirIt middle, BidirIt last,
Compare comp );

(since C++17)

# Parameters

# Notes

This function attempts to allocate a temporary buffer. If the allocation fails, the less efficient algorithm is chosen.

# Example

#include <algorithm>
#include <iostream>
#include <vector>
 
template<class Iter>
void merge_sort(Iter first, Iter last)
{
    if (last - first > 1)
    {
        Iter middle = first + (last - first) / 2;
        merge_sort(first, middle);
        merge_sort(middle, last);
        std::inplace_merge(first, middle, last);
    }
}
 
int main()
{
    std::vector<int> v{8, 2, -2, 0, 11, 11, 1, 7, 3};
    merge_sort(v.begin(), v.end());
    for (const auto& n : v)
        std::cout << n << ' ';
    std::cout << '\n';
}

# See also