Namespaces
Variants

std::multimap<Key,T,Compare,Allocator>:: multimap

From cppreference.net

(Anmerkung: Der bereitgestellte HTML-Code enthält keinen übersetzbaren Text, da alle Tags leer sind. Die Struktur und Formatierung bleiben unverändert.)
(1)
multimap ( ) ;
(bis C++11)
multimap ( ) : multimap ( Compare ( ) ) { }
(seit C++11)
(constexpr seit C++26)
explicit multimap ( const Compare & comp,
const Allocator & alloc = Allocator ( ) ) ;
(2) (constexpr seit C++26)
explicit multimap ( const Allocator & alloc ) ;
(3) (seit C++11)
(constexpr seit C++26)
template < class InputIt >

multimap ( InputIt first, InputIt last,
const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(4) (constexpr seit C++26)
template < class InputIt >

multimap ( InputIt first, InputIt last,
const Allocator & alloc )

: multimap ( first, last, Compare ( ) , alloc ) { }
(5) (seit C++14)
(constexpr seit C++26)
multimap ( const multimap & other ) ;
(6) (constexpr seit C++26)
multimap ( const multimap & other, const Allocator & alloc ) ;
(7) (seit C++11)
(constexpr seit C++26)
multimap ( multimap && other ) ;
(8) (seit C++11)
(constexpr seit C++26)
multimap ( multimap && other, const Allocator & alloc ) ;
(9) (seit C++11)
(constexpr seit C++26)
multimap ( std:: initializer_list < value_type > init,

const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(10) (seit C++11)
(constexpr seit C++26)
multimap ( std:: initializer_list < value_type > init,

const Allocator & alloc )

: multimap ( init, Compare ( ) , alloc ) { }
(11) (seit C++14)
(constexpr seit C++26)
template < container-compatible-range < value_type > R >

multimap ( std:: from_range_t , R && rg,
const Compare & comp = Compare ( ) ,

const Allocator & alloc = Allocator ( ) ) ;
(12) (seit C++23)
(constexpr seit C++26)
template < container-compatible-range < value_type > R >

multimap ( std:: from_range_t , R && rg,
const Allocator & alloc )

: multimap ( std:: from_range , std:: forward < R > ( rg ) , Compare ( ) , alloc ) { }
(13) (seit C++23)
(constexpr seit C++26)

Konstruiert einen neuen Container aus verschiedenen Datenquellen und optional unter Verwendung eines benutzerdefinierten Allokators alloc oder Vergleichsfunktionsobjekts comp .

1-3) Konstruiert einen leeren Container.
4,5) Konstruiert den Container mit den Inhalten des Bereichs [ first , last ) .
Wenn [ first , last ) kein gültiger Bereich ist, ist das Verhalten undefiniert.
6,7) Konstruiert den Container mit einer Kopie der Inhalte von other .

Falls alloc nicht bereitgestellt wird, wird der Allokator durch Aufruf von std:: allocator_traits < allocator_type > ::
select_on_container_copy_construction ( other. get_allocator ( ) )
erhalten.

(seit C++11)

Während der Klassentemplate-Argumentableitung trägt nur das erste Argument zur Ableitung des Allocator -Templateparameters des Containers bei.

(seit C++23)
8,9) Konstruiert den Container mit den Inhalten von other unter Verwendung von Move-Semantik. Wenn alloc nicht bereitgestellt wird, wird der Allokator durch Move-Konstruktion vom Allokator von other bezogen.

Während der Klassentemplate-Argumentableitung trägt nur das erste Argument zur Ableitung des Allocator -Templateparameters des Containers bei.

(since C++23)
10,11) Konstruiert den Container mit den Inhalten der Initialisierungsliste init .
12,13) Konstruiert den Container mit den Inhalten von rg .

Inhaltsverzeichnis

Parameter

alloc - Allokator, der für alle Speicherallokationen dieses Containers verwendet wird
comp - Vergleichsfunktionsobjekt, das für alle Schlüsselvergleiche verwendet wird
first, last - das Iteratorpaar, das die Quelle range der zu kopierenden Elemente definiert
other - ein weiterer Container, der als Quelle zur Initialisierung der Elemente des Containers verwendet wird
init - Initialisierungsliste zur Initialisierung der Elemente des Containers
rg - ein container compatible range , also ein input_range , dessen Elemente in value_type konvertierbar sind
Typanforderungen
-
InputIt muss die Anforderungen von LegacyInputIterator erfüllen.
-
Compare muss die Anforderungen von Compare erfüllen.
-
Allocator muss die Anforderungen von Allocator erfüllen.

Komplexität

1-3) Konstante.
4,5) N·log(N) wobei N ist std:: distance ( first, last ) im Allgemeinen, linear in N falls [ first , last ) bereits sortiert ist nach value_comp ( ) .
6,7) Linear in der Größe von other .
8,9) Konstant. Wenn alloc angegeben ist und alloc ! = other. get_allocator ( ) , dann linear.
10,11) N·log(N) wobei N die init. size ( ) ist, im Allgemeinen linear in N falls init bereits nach value_comp ( ) sortiert ist.
12,13) N·log(N) wobei N ranges:: distance ( rg ) entspricht, im Allgemeinen linear in N falls rg bereits durch value_comp ( ) sortiert ist.

Exceptions

Aufrufe von Allocator::allocate können eine Ausnahme auslösen.

Hinweise

Nach Container-Verschiebekonstruktion (Überladung ( 8,9 ) ) bleiben Referenzen, Zeiger und Iteratoren (außer dem End-Iterator) auf other gültig, verweisen jedoch auf Elemente, die sich nun in * this befinden. Der aktuelle Standard gibt diese Garantie durch die pauschale Aussage in [container.reqmts]/67 , und eine direktere Garantie wird via LWG issue 2321 erwogen.

Obwohl es erst ab C++23 formal erforderlich ist, haben einige Implementierungen den Template-Parameter Allocator bereits in früheren Modi in nicht abgeleitete Kontexte platziert.

Feature-Test Makro Wert Std Funktion
__cpp_lib_containers_ranges 202202L (C++23) Ranges-bewusste Konstruktion und Einfügung; Überladungen ( 12,13 )

Beispiel

#include <iostream>
#include <map>
#include <utility>
struct Point { double x, y; };
struct PointCmp
{
    bool operator()(const Point& lhs, const Point& rhs) const
    {
        return lhs.x < rhs.x; // NB. ignoriert y absichtlich
    }
};
template <typename Key, typename Value, typename Cmp>
void println(auto rem, const std::multimap<Key, Value, Cmp>& map)
{
    std::cout << rem << "{ ";
    for (auto n{map.size()}; const auto& p : map)
        std::cout << '[' << p.first << ":" << p.second << (--n ? "], " : "]");
    std::cout << " }\n";
}
int main()
{
    std::multimap<int, int> m1 =
    {
        {1, 1}, {2, 2}, {3, 3}, {4, 4}, {4, 4}, {3, 3}, {2, 2}, {1, 1}
    };
    println("m1 = ", m1);
    // Benutzerdefinierter Vergleich
    std::multimap<Point, double, PointCmp> mag
    {
        {{5, 12}, 13},
        {{3, 4}, 5},
        {{8, 15}, 17},
        {{3, -3}, -1}
    };
    for (auto p : mag)
        std::cout << "Die Magnitude von (" << p.first.x << ", " << p.first.y << ")"
                     " ist " << p.second << '\n';
    std::cout << "Konstruktion aus einem Bereich:\n";
    using PS = std::pair<int, std::string>;
    const auto rg = {PS{3, "Earth"}, {2, "Venus"}, {1, "Mercury"}, {3, "Moon"}};
#if __cpp_lib_containers_ranges
    std::multimap<int, std::string> m2(std::from_range, rg); // Überladung (12)
#else
    std::multimap<int, std::string> m2(rg.begin(), rg.end()); // Fallback auf (4)
#endif
    println("m2 = ", m2);
}

Ausgabe:

m1 = { [1:1], [1:1], [2:2], [2:2], [3:3], [3:3], [4:4], [4:4] }
Die Magnitude von (3, 4) ist 5
Die Magnitude von (3, -3) ist -1
Die Magnitude von (5, 12) ist 13
Die Magnitude von (8, 15) ist 17
Konstruktion aus einem Bereich:
m2 = { [1:Mercury], [2:Venus], [3:Earth], [3:Moon] }

Fehlerberichte

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

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2076 C++11 Überladung ( 4 ) bedingt erforderte Key und T als CopyInsertable in * this nicht erforderlich
LWG 2193 C++11 der Standardkonstruktor war explicit als non-explicit festgelegt

Siehe auch

weist dem Container Werte zu
(öffentliche Elementfunktion)