std::ranges::make_heap(3)
β¨ std::ranges::make_heap β¨
okay so bestie, this is the C++ Standard Libary manual page for std::ranges::make_heap (section (3), iykyk π
). It's giving algorithm-girlie energy and honestly? iconic.
π NAME π
std::ranges::make_heap β std::ranges::make_heap
That's the name section. She's brief, she's self-referential, we love her. π
π¦ Synopsis π¦
Defined in header <algorithm>.
Call signature:
template< std::random_access_iterator I, std::sentinel_for<I> S,
class Comp = ranges::less, class Proj = std::identity >
requires std::sortable<I, Comp, Proj>
(1) (since C++20)
constexpr I
make_heap( I first, S last, Comp comp = {}, Proj proj = {} );
template< ranges::random_access_range R, class Comp = ranges::less,
class Proj = std::identity >
(2) (since C++20)
requires std::sortable<ranges::iterator_t<R>, Comp, Proj>
constexpr ranges::borrowed_iterator_t<R>
make_heap( R&& r, Comp comp = {}, Proj proj = {} );
It constructs a max heap in the range [first, last). No cap. β¨
- Elements are compared using the given binary comparison function
compand projection objectproj. - Same as (1), but uses
ras the range, as if usingranges::begin(r)asfirstandranges::end(r)aslast.
The function-like entities described on this page are niebloids, that is:
- Explicit template argument lists cannot be specified when calling any of them.
- None of them are visible to argument-dependent lookup.
- When any of them are found by normal unqualified lookup as the name to the left of the function-call operator, argument-dependent lookup is inhibited.
In practice, they may be implemented as function objects, or with special compiler extensions.
π¦ Parameters π¦
first,lastβ the range of elements to make the heap fromrβ the range of elements to make the heap frompredβ predicate to apply to the projected elementsprojβ projection to apply to the elements
π Return value π
An iterator equal to last. That's the whole tea. π
β Complexity β
Given N = ranges::distance(first, last), at most 3*N comparisons and 6*N projections. She's doing the math, bestie. β¨
πΈ Notes πΈ
A max heap is a range of elements [f, l), arranged with respect to comparator comp and projection proj, that has the following properties:
- With
N = l - f,p = f[(i - 1) / 2], andq = f[i], for all0 < i < N, the expressionstd::invoke(comp, std::invoke(proj, p), std::invoke(proj, q))evaluates tofalse. - A new element can be added using
ranges::push_heap, inπ(log N)time. - The first element can be removed using
ranges::pop_heap, inπ(log N)time.
π§ Example π§
Run this code, bestie π
// Run this code
#include <algorithm>
#include <cmath>
#include <functional>
#include <iostream>
#include <vector>
void out(const auto& what, int n = 1)
{
while (n-- > 0)
std::cout << what;
}
void print(auto rem, auto const& v)
{
out(rem);
for (auto e : v)
out(e), out(' ');
out('\n');
}
void draw_heap(auto const& v)
{
auto bails = [](int n, int w)
{
auto b = [](int w) { out("β"), out("β", w), out("β΄"), out("β", w), out("β"); };
if (!(n /= 2))
return;
for (out(' ', w); n-- > 0;)
b(w), out(' ', w + w + 1);
out('\n');
};
auto data = [](int n, int w, auto& first, auto last)
{
for (out(' ', w); n-- > 0 && first != last; ++first)
out(*first), out(' ', w + w + 1);
out('\n');
};
auto tier = [&](int t, int m, auto& first, auto last)
{
const int n{1 << t};
const int w{(1 << (m - t - 1)) - 1};
bails(n, w), data(n, w, first, last);
};
const int m{static_cast<int>(std::ceil(std::log2(1 + v.size())))};
auto first{v.cbegin()};
for (int i{}; i != m; ++i)
tier(i, m, first, v.cend());
}
int main()
{
std::vector h{1, 6, 1, 8, 0, 3, 3, 9, 8, 8, 7, 4, 9, 8, 9};
print("source: ", h);
std::ranges::make_heap(h);
print("\n" "max-heap: ", h);
draw_heap(h);
std::ranges::make_heap(h, std::greater{});
print("\n" "min-heap: ", h);
draw_heap(h);
}
π Output π
source: 1 6 1 8 0 3 3 9 8 8 7 4 9 8 9
max-heap: 9 8 9 8 8 4 9 6 1 0 7 1 3 8 3
9
βββββ΄ββββ
8 9
βββ΄ββ βββ΄ββ
8 8 4 9
ββ΄β ββ΄β ββ΄β ββ΄β
6 1 0 7 1 3 8 3
min-heap: 0 1 1 8 6 3 3 9 8 8 7 4 9 8 9
0
βββββ΄ββββ
1 1
βββ΄ββ βββ΄ββ
8 6 3 3
ββ΄β ββ΄β ββ΄β ββ΄β
9 8 8 7 4 9 8 9
π See also π
ranges::is_heap(C++20)(niebloid)β checks if the given range is a max heapranges::is_heap_until(C++20)(niebloid)β finds the largest subrange that is a max heapranges::push_heap(C++20)(niebloid)β adds an element to a max heapranges::pop_heap(C++20)(niebloid)β removes the largest element from a max heapranges::sort_heap(C++20)(niebloid)β turns a max heap into a range of elements sorted in ascending ordermake_heap(function template)β creates a max heap out of a range of elements
xoxo bestie π source: http://cppreference.com Β· version/date: 2024.06.10 Β· page: std::ranges::make_heap(3) β that's the footer, love u, bye π«Ά
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms