std::inplace_merge
Template:ddcl list begin <tr class="t-dsc-header">
<td><algorithm>
<td></td> <td></td> </tr> <tr class="t-dcl ">
<td >void inplace_merge( BidirIt first, BidirIt middle, BidirIt last );
<td > (1) </td> <td class="t-dcl-nopad"> </td> </tr> <tr class="t-dcl ">
<td >void inplace_merge( BidirIt first, BidirIt middle, BidirIt last, Compare comp );
<td > (2) </td> <td class="t-dcl-nopad"> </td> </tr> Template:ddcl list end
Merges two consecutive sorted ranges [first, middle)
and [middle, last)
into one sorted range [first, last)
. The order of equal elements is guaranteed to be preserved. The first version uses operator< to compare the elements, the second version uses the given comparison function comp
.
Contents |
Parameters
first | - | the beginning of the first sorted range |
middle | - | the end of the first sorted range and the beginning of the second |
last | - | the end of the second sorted range |
comp | - | comparison function object (i.e. an object that satisfies the requirements of Compare) which returns true if the first argument is less than the second. The signature of the comparison function should be equivalent to the following: bool cmp(const Type1& a, const Type2& b); While the signature does not need to have const&, the function must not modify the objects passed to it and must be able to accept all values of type (possibly const) |
Type requirements | ||
-BidirIt must meet the requirements of LegacyBidirectionalIterator.
|
Return value
(none)
Complexity
Exactly N-1 comparisons if enough additional memory is available, otherwise N·log(N) where N = std::distance(first, last).
Notes
This function attempts to allocate a temporary buffer, typically by calling std::get_temporary_buffer. If the allocation fails, the less efficient algorithm is chosen.
Example
The following code is an implementation of merge sort.
#include <vector> #include <iostream> #include <algorithm> 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(auto n : v) { std::cout << n << ' '; } std::cout << '\n'; }
Output:
-2 0 1 2 3 7 8 11 11