Namensräume
Varianten
Aktionen

Deduktionshilfen für std::priority_queue

Von cppreference.com
 
 
 
 
Definiert in Header <queue>
template< class Comp, class Container >

priority_queue( Comp, Container )

    -> priority_queue<typename Container::value_type, Container, Comp>;
(1) (seit C++17)
template< class InputIt,

          class Comp = std::less</*iter-value-type*/<InputIt>>,
          class Container = std::vector</*iter-value-type*/<InputIt> >
priority_queue( InputIt, InputIt, Comp = Comp(), Container = Container() )

    -> priority_queue</*iter-value-type*/<InputIt>, Container, Comp>;
(2) (seit C++17)
template< class Comp, class Container, class Alloc >

priority_queue( Comp, Container, Alloc )

    -> priority_queue<typename Container::value_type, Container, Comp>;
(3) (seit C++17)
template< class InputIt, class Alloc >

priority_queue( InputIt, InputIt, Alloc )
    -> priority_queue</*iter-value-type*/<InputIt>,
                      std::vector</*iter-value-type*/<InputIt>, Alloc>,

                      std::less</*iter-value-type*/<InputIt>>>;
(4) (seit C++17)
template< class InputIt, class Comp, class Alloc >

priority_queue( InputIt, InputIt, Comp, Alloc )
    -> priority_queue</*iter-value-type*/<InputIt>,

                      std::vector</*iter-value-type*/<InputIt>, Alloc>, Comp>;
(5) (seit C++17)
template< class InputIt, class Comp, class Container, class Alloc >

priority_queue( InputIt, InputIt, Comp, Container, Alloc )

    -> priority_queue<typename Container::value_type, Container, Comp>;
(6) (seit C++17)
template< ranges::input_range R,

          class Comp = std::less<ranges::range_value_t<R>> >
priority_queue( std::from_range_t, R&&, Comp = Comp() )
    -> priority_queue<ranges::range_value_t<R>,

                      std::vector<ranges::range_value_t<R>>, Comp>;
(7) (seit C++23)
template< ranges::input_range R, class Comp, class Alloc >

priority_queue( std::from_range_t, R&&, Comp, Alloc )
    -> priority_queue<ranges::range_value_t<R>,

                      std::vector<ranges::range_value_t<R>, Alloc>, Comp>;
(8) (seit C++23)
template< ranges::input_range R, class Alloc >

priority_queue( std::from_range_t, R&&, Alloc )
    -> priority_queue<ranges::range_value_t<R>,

                      std::vector<ranges::range_value_t<R>, Alloc>>;
(9) (seit C++23)

Die folgenden Deduktionshilfen sind für std::priority_queue verfügbar

1-6) Ermöglichen Deduktion vom zugrundeliegenden Containertyp und von einem Iterator-Bereich. /*iter-value-type*/<It> bezeichnet typename std::iterator_traits<It>::value_type für jeden Typ It.
7-9) Ermöglichen Deduktion von einem std::from_range_t-Tag und einem input_range.

Diese Überladungen nehmen nur an der Auflösung von Überladungen teil, wenn

Hinweis: Das Ausmaß, in dem die Bibliothek feststellt, dass ein Typ LegacyInputIterator nicht erfüllt, ist nicht spezifiziert, außer dass ganzzahlige Typen als Eingabeiteratoren nicht qualifiziert sind. Ebenso ist das Ausmaß, in dem sie feststellt, dass ein Typ Allocator nicht erfüllt, nicht spezifiziert, außer dass als Minimum der Mitgliedstyp Alloc::value_type existieren muss und der Ausdruck std::declval<Alloc&>().allocate(std::size_t{}) als nicht ausgewerteter Operand gut geformt sein muss.

[bearbeiten] Hinweise

Feature-Test-Makro Wert Std Feature
__cpp_lib_containers_ranges 202202L (C++23) Bereichsweise Konstruktion und Einfügung; Überladungen (7-9)

[bearbeiten] Beispiel

#include <functional>
#include <iostream>
#include <queue>
#include <vector>
 
int main()
{
    const std::vector<int> v = {1, 2, 3, 4};
    std::priority_queue pq1{std::greater<int>{}, v}; // deduces std::priority_queue<
                                                     //     int, std::vector<int>,
                                                     //     std::greater<int>>
    for (; !pq1.empty(); pq1.pop())
        std::cout << pq1.top() << ' ';
    std::cout << '\n';
 
    std::priority_queue pq2{v.begin(), v.end()}; // deduces std::priority_queue<int>
 
    for (; !pq2.empty(); pq2.pop())
        std::cout << pq2.top() << ' ';
    std::cout << '\n';
}

Ausgabe

1 2 3 4
4 3 2 1

[bearbeiten] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3506 C++17 Deduktionshilfen von Iterator und Allokator fehlten hinzugefügt