std::priority_queue::priority_queue(3)

NAME
std::priority_queue::priority_queue - std::priority_queue::priority_queue

Synopsis
   priority_queue() : priority_queue(Compare(), (1) (since
   Container()) {} C++11)
   explicit priority_queue( const Compare& compare ) (2) (since
       : priority_queue(compare, Container()) {} C++11)
   explicit priority_queue( const Compare& compare =
   Compare(), (until
                        const Container& cont = C++11)
   Container() );
   priority_queue( const Compare& compare, const Container& (since
   cont ); C++11)
   priority_queue( const Compare& compare, Container&& cont (4) (since
   ); C++11)
   priority_queue( const priority_queue& other ); (5)
   priority_queue( priority_queue&& other ); (6) (since
                        C++11)
   template< class InputIt >
                        (since
   priority_queue( InputIt first, InputIt last, (7) C++11)
                   const Compare& compare = Compare() );
   template< class InputIt >
   priority_queue( InputIt first, InputIt last, (until
                   const Compare& compare = Compare(), C++11)
                   const Container& cont = Container() );
   template< class InputIt >
   priority_queue( InputIt first, InputIt last, (since
                        C++11)
                   const Compare& compare, const Container&
   cont );
   template< class InputIt >
   priority_queue( InputIt first, InputIt last, (9) (since
                        C++11)
                   const Compare& compare, Container&& cont
   );
   template< class Alloc > (10) (since
   explicit priority_queue( const Alloc& alloc ); C++11)
   template< class Alloc > (since
   priority_queue( const Compare& compare, const Alloc& (11) C++11)
   alloc );
   template< class Alloc >
   priority_queue( const Compare& compare, const Container& (12) (since
   cont, C++11)
                   const Alloc& alloc );
   template< class Alloc >
                        (3)
   priority_queue( const Compare& compare, Container&& (13) (since
   cont, C++11)
                   const Alloc& alloc );
   template< class Alloc > (since
   priority_queue( const priority_queue& other, const (14) C++11)
   Alloc& alloc );
   template< class Alloc > (8) (since
   priority_queue( priority_queue&& other, const Alloc& (15) C++11)
   alloc );
   template< class InputIt, class Alloc > (since
   priority_queue( InputIt first, InputIt last, const (16) C++11)
   Alloc& alloc );
   template< class InputIt, class Alloc >
   priority_queue( InputIt first, InputIt last, const (17) (since
   Compare& compare, C++11)
                   const Alloc& alloc );
   template< class InputIt, class Alloc >
   priority_queue( InputIt first, InputIt last, const (since
   Compare& compare, (18) C++11)
                   const Container& cont, const Alloc&
   alloc );
   template< class InputIt, class Alloc >
   priority_queue( InputIt first, InputIt last, const (19) (since
   Compare& compare, C++11)
                   Container&& cont, const Alloc& alloc );
   template< container-compatible-range<T> R >
                        (since
   priority_queue( std::from_range_t, R&& rg, (20) C++23)
                   const Compare& compare = Compare() );
   template< container-compatible-range<T> R, class Alloc >
   priority_queue( std::from_range_t, R&& rg, (21) (since
                        C++23)
                   const Compare& compare, const Alloc&
   alloc );
   template< container-compatible-range<T> R, class Alloc > (since
   priority_queue( std::from_range_t, R&& rg, const Alloc& (22) C++23)
   alloc );
   Constructs new underlying container of the container adaptor from a variety of data
   sources.
   1) Default constructor. Value-initializes the comparator and the underlying
   container.
   2) Copy-constructs the comparison functor comp with the contents of compare.
   Value-initializes the underlying container c.
   3) Copy-constructs the underlying container c with the contents of cont.
   Copy-constructs the comparison functor comp with the contents of compare. Calls
   std::make_heap(c.begin(), c.end(), comp).
   This is also the default constructor.
   (until C++11)
   4) Move-constructs the underlying container c with std::move(cont). Copy-constructs
   the comparison functor comp with compare. Calls std::make_heap(c.begin(), c.end(),
   comp).
   5) Copy constructor. The underlying container is copy-constructed with other.c. The
   comparison functor is copy-constructed with other.comp. (implicitly declared)
   6) Move constructor. The underlying container is constructed with
   std::move(other.c). The comparison functor is constructed with
   std::move(other.comp). (implicitly declared)
   7-9) Iterator-pair constructors. These overloads participate in overload resolution
   only if InputIt satisfies LegacyInputIterator.
   7) Constructs c as if by c(first, last) and comp from compare. Then calls
   std::make_heap(c.begin(), c.end(), comp);.
   8) Copy-constructs c from cont and comp from compare. Then calls c.insert(c.end(),
   first, last);, and then calls std::make_heap(c.begin(), c.end(), comp);.
   9) Move-constructs c from std::move(cont) and copy-constructs comp from compare.
   Then calls c.insert(c.end(), first, last);, and then calls std::make_heap(c.begin(),
   c.end(), comp);.
   10-15) Allocator-extended constructors. These overloads participate in overload
   resolution only if std::uses_allocator<container_type, Alloc>::value is true, that
   is, if the underlying container is an allocator-aware container (true for all
   standard library containers).
   10) Constructs the underlying container using alloc as allocator. Effectively calls
   c(alloc). comp is value-initialized.
   11) Constructs the underlying container using alloc as allocator. Effectively calls
   c(alloc). Copy-constructs comp from compare.
   12) Constructs the underlying container with the contents of cont and using alloc as
   allocator, as if by c(cont, alloc). Copy-constructs comp from compare. Then calls
   std::make_heap(c.begin(), c.end(), comp).
   13) Constructs the underlying container with the contents of cont using move
   semantics while using alloc as allocator, as if by c(std::move(cont), alloc).
   Copy-constructs comp from compare. Then calls std::make_heap(c.begin(), c.end(),
   comp).
   14) Constructs the underlying container with the contents of other.c and using alloc
   as allocator. Effectively calls c(other.c, alloc). Copy-constructs comp from
   other.comp.
   15) Constructs the underlying container with the contents of other using move
   semantics while utilizing alloc as allocator. Effectively calls
   c(std::move(other.c), alloc). Move-constructs comp from other.comp.
   16-19) Allocator-extended iterator-pair constructors. Same as (7-9), except that
   alloc is used for constructing the underlying container. These overloads participate
   in overload resolution only if std::uses_allocator<container_type, Alloc>::value is
   true and InputIt satisfies LegacyInputIterator.
   20) Initializes comp with compare and c with
   ranges::to<Container>(std::forward<R>(rg)). Then calls std::make_heap(c.begin(),
   c.end(), comp).
   21) Initializes comp with compare and c with
   ranges::to<Container>(std::forward<R>(rg), alloc). Then calls
   std::make_heap(c.begin(), c.end(), comp).
   22) Initializes c with ranges::to<Container>(std::forward<R>(rg), alloc). Then calls
   std::make_heap(c.begin(), c.end(), comp).
   Note that how an implementation checks whether a type satisfies LegacyInputIterator
   is unspecified, except that integral types are required to be rejected.

Parameters
   alloc - allocator to use for all memory allocations of the
                        underlying container
   other - another container adaptor to be used as source to
                        initialize the underlying container
   cont - container to be used as source to initialize the
                        underlying container
   compare - the comparison function object to initialize the
                        underlying comparison functor
   first, last - a range [first, last) of elements to initialize with
   rg - a container compatible range, that is, an input_range
                        whose elements are convertible to T

Type requirements
   -
   Alloc must meet the requirements of Allocator.
   -
   Compare must meet the requirements of Compare.
   -
   Container must meet the requirements of Container. The allocator-extended
   constructors are only defined if Container meets the requirements of
   AllocatorAwareContainer.
   -
   InputIt must meet the requirements of LegacyInputIterator.

Complexity
   1,2) Constant.
   3,5,12) \(\scriptsize \mathcal{O}{(N)}\)O(N) comparisons and \(\scriptsize
   \mathcal{O}{(N)}\)O(N) calls to the constructor of value_type, where \(\scriptsize
   N\)N is cont.size().
   4) \(\scriptsize \mathcal{O}{(N)}\)O(N) comparisons, where \(\scriptsize N\)N is
   cont.size().
   6) Constant.
   7,16,17) \(\scriptsize \mathcal{O}{(M)}\)O(M) comparisons, where \(\scriptsize M\)M
   is std::distance(first, last).
   8,18) \(\scriptsize \mathcal{O}{(N + M)}\)O(N + M) comparisons and \(\scriptsize
   \mathcal{O}{(N)}\)O(N) calls to the constructor of value_type, where \(\scriptsize
   N\)N is cont.size() and \(\scriptsize M\)M is std::distance(first, last).
   9) \(\scriptsize \mathcal{O}{(N + M)}\)O(N + M) comparisons, where \(\scriptsize
   N\)N is cont.size() and \(\scriptsize M\)M is std::distance(first, last).
   10,11) Constant.
   13) \(\scriptsize \mathcal{O}{(N)}\)O(N) comparisons, where \(\scriptsize N\)N is
   cont.size().
   14) Linear in size of other.
   15) Constant if Alloc compares equal to the allocator of other. Linear in size of
   other otherwise.
   19) \(\scriptsize \mathcal{O}{(N + M)}\)O(N + M) comparisons and possibly
   \(\scriptsize \mathcal{O}{(N)}\)O(N) calls to the constructor of value_type (present
   if Alloc does not compare equal to the allocator of other), where \(\scriptsize N\)N
   is cont.size() and \(\scriptsize M\)M is std::distance(first, last).
   20) \(\scriptsize \mathcal{O}{(N)}\)O(N) comparisons and \(\scriptsize
   \mathcal{O}{(N)}\)O(N) calls to the constructor of value_type, where \(\scriptsize
   N\)N is ranges::distance(rg).
   21,22)
    This section is incomplete

Notes
       Feature-test macro Value Std Feature
   __cpp_lib_containers_ranges 202202L (C++23) Ranges-aware construction and insertion;
                        overloads (20-22)

Example
// Run this code
 #include <complex>
 #include <functional>
 #include <iostream>
 #include <queue>
 #include <vector>
 int main()
 {
     std::priority_queue<int> pq1;
     pq1.push(5);
     std::cout << "pq1.size() = " << pq1.size() << '\n';
     std::priority_queue<int> pq2 {pq1};
     std::cout << "pq2.size() = " << pq2.size() << '\n';
     std::vector<int> vec {3, 1, 4, 1, 5};
     std::priority_queue<int> pq3 {std::less<int>(), vec};
     std::cout << "pq3.size() = " << pq3.size() << '\n';
     for (std::cout << "pq3 : "; !pq3.empty(); pq3.pop())
         std::cout << pq3.top() << ' ';
     std::cout << '\n';
     // Demo With Custom Comparator:
     using my_value_t = std::complex<double>;
     using my_container_t = std::vector<my_value_t>;
     auto my_comp = [](const my_value_t& z1, const my_value_t& z2)
     {
         return z2.real() < z1.real();
     };
     std::priority_queue<my_value_t,
                        my_container_t,
                        decltype(my_comp)> pq4{my_comp};
     using namespace std::complex_literals;
     pq4.push(5.0 + 1i);
     pq4.push(3.0 + 2i);
     pq4.push(7.0 + 3i);
     for (; !pq4.empty(); pq4.pop())
     {
         const auto& z = pq4.top();
         std::cout << "pq4.top() = " << z << '\n';
     }
     // TODO: C++23 range-aware ctors
 }

Output:
 pq1.size() = 1
 pq2.size() = 1
 pq3.size() = 5
 pq3 : 5 4 3 1 1
 pq4.top() = (3,2)
 pq4.top() = (5,1)
 pq4.top() = (7,3)
   Defect reports
   The following behavior-changing defect reports were applied retroactively to
   previously published C++ standards.
      DR Applied to Behavior as published Correct behavior
   P0935R0 C++11 default constructor and constructor (4) made implicit
                       were explicit
   LWG 3506 C++11 allocator-extended iterator-pair added
                       constructors were missing
   LWG 3522 C++11 constraints on iterator-pair added
                       constructors were missing
   LWG 3529 C++11 construction from a pair of iterators constructs the container
                       called insert from them

See also
   operator= assigns values to the container adaptor
             (public member function)

Category:
     * Todo without reason