Constrained algorithms and algorithms on ranges(C++20) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Constrained algorithms, e.g.ranges::copy,ranges::sort, ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Execution policies(C++17) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Numeric operations | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Operations on uninitialized memory | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
std::ranges
Non-modifying sequence operations | |||||||||||||||||||||||||||||||||
Modifying sequence operations | |||||||||||||||||||||||||||||||||
Partitioning operations | |||||||||||||||||||||||||||||||||
Sorting operations | |||||||||||||||||||||||||||||||||
Binary search operations (on sorted ranges) | |||||||||||||||||||||||||||||||||
Set operations (on sorted ranges) | |||||||||||||||||||||||||||||||||
Heap operations | |||||||||||||||||||||||||||||||||
Minimum/maximum operations | |||||||||||||||||||||||||||||||||
Permutation operations | |||||||||||||||||||||||||||||||||
Fold operations | |||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||
Operations on uninitialized storage | |||||||||||||||||||||||||||||||||
Return types | |||||||||||||||||||||||||||||||||
Defined in header <algorithm> | ||
Call signature | ||
template<std::random_access_iterator I,std::sentinel_for<I> S, class Proj=std::identity, | (1) | (since C++20) |
template<ranges::random_access_range R,class Proj=std::identity, std::indirect_strict_weak_order | (2) | (since C++20) |
Checks whether the specified range represents aheap with respect tocomp andproj.
[
first,
last)
.The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:
Contents |
first, last | - | the iterator-sentinel pair defining therange of elements to examine |
r | - | therange of elements to examine |
comp | - | comparator to apply to the projected elements |
proj | - | projection to apply to the elements |
\(\scriptsize O(N) \)O(N) applications ofcomp andproj, where\(\scriptsize N \)N is:
struct is_heap_fn{template<std::random_access_iterator I,std::sentinel_for<I> S,class Proj=std::identity,std::indirect_strict_weak_order<std::projected<I, Proj>> Comp=ranges::less>constexprbool operator()(I first, S last, Comp comp={}, Proj proj={})const{return(last==ranges::is_heap_until(first, last, std::move(comp), std::move(proj)));} template<ranges::random_access_range R,class Proj=std::identity,std::indirect_strict_weak_order<std::projected<ranges::iterator_t<R>, Proj>> Comp=ranges::less>constexprbool operator()(R&& r, Comp comp={}, Proj proj={})const{return(*this)(ranges::begin(r),ranges::end(r), std::move(comp), std::move(proj));}}; inlineconstexpr is_heap_fn is_heap{}; |
#include <algorithm>#include <bit>#include <cmath>#include <iostream>#include <vector> void out(constauto& what,int n=1){while(n-->0)std::cout<< what;} void draw_heap(constauto& v){auto bails=[](int n,int w){auto b=[](int w){ out("┌"), out("─", w), out("┴"), out("─", w), out("┐");}; n/=2;if(!n)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){constint n{1<< t};constint w{(1<<(m- t-1))-1}; bails(n, w), data(n, w, first, last);}; constint 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<int> v{3,1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3,8}; out("initially, v:\n");for(auto i: v)std::cout<< i<<' '; out('\n'); if(!std::ranges::is_heap(v)){ out("making heap...\n"); std::ranges::make_heap(v);} out("after make_heap, v:\n");for(auto t{1U};auto i: v)std::cout<< i<<(std::has_single_bit(++t)?" │ ":" "); out("\n""corresponding binary tree is:\n"); draw_heap(v);}
Output:
initially, v:3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8making heap...after make_heap, v:9 │ 8 9 │ 6 5 8 9 │ 3 5 3 5 3 4 7 2 │ 1 2 3 1corresponding binary tree is: 9 ┌───────┴───────┐ 8 9 ┌───┴───┐ ┌───┴───┐ 6 5 8 9 ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ ┌─┴─┐ 3 5 3 5 3 4 7 2┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐1 2 3 1
(C++20) | finds the largest subrange that is a max heap (algorithm function object)[edit] |
(C++20) | creates a max heap out of a range of elements (algorithm function object)[edit] |
(C++20) | adds an element to a max heap (algorithm function object)[edit] |
(C++20) | removes the largest element from a max heap (algorithm function object)[edit] |
(C++20) | turns a max heap into a range of elements sorted in ascending order (algorithm function object)[edit] |
(C++11) | checks if the given range is a max heap (function template)[edit] |