Namensräume
Varianten
Aktionen

std::unordered_map<Key,T,Hash,KeyEqual,Allocator>::merge

Von cppreference.com
 
 
 
 
template< class H2, class P2 >
void merge( std::unordered_map<Key, T, H2, P2, Allocator>& source );
(1) (seit C++17)
template< class H2, class P2 >
void merge( std::unordered_map<Key, T, H2, P2, Allocator>&& source );
(2) (seit C++17)
template< class H2, class P2 >
void merge( std::unordered_multimap<Key, T, H2, P2, Allocator>& source );
(3) (seit C++17)
template< class H2, class P2 >
void merge( std::unordered_multimap<Key, T, H2, P2, Allocator>&& source );
(4) (seit C++17)

Versucht, jedes Element in source zu extrahieren ("splicen") und in *this einzufügen, unter Verwendung der Hash-Funktion und des Schlüsselgleichheitsprädikats von *this. Wenn es ein Element in *this gibt, dessen Schlüssel äquivalent zum Schlüssel eines Elements aus source ist, dann wird dieses Element nicht aus source extrahiert. Es werden keine Elemente kopiert oder verschoben, nur die internen Zeiger der Containerknoten werden neu ausgerichtet. Alle Zeiger und Referenzen auf die übertragenen Elemente bleiben gültig, verweisen aber nun auf *this und nicht auf source. Iteratoren, die auf die übertragenen Elemente verweisen, und alle Iteratoren, die auf *this verweisen, werden ungültig. Iteratoren auf verbleibende Elemente in source bleiben gültig.

Das Verhalten ist undefiniert, wenn get_allocator() != source.get_allocator().

Inhalt

[bearbeiten] Parameter

source - kompatibler Container, von dem die Knoten übertragen werden sollen

[bearbeiten] Rückgabewert

(keine)


[bearbeiten] Komplexität

Durchschnittlicher Fall O(N), schlimmster Fall O(N * size() + N), wobei N source.size() ist.

[bearbeiten] Beispiel

#include <iostream>
#include <string>
#include <unordered_map>
#include <utility>
 
// print out a std::pair
template<class Os, class U, class V>
Os& operator<<(Os& os, const std::pair<U,V>& p)
{
    return os << '{' << p.first << ", " << p.second << '}';
}
 
// print out an associative container
template<class Os, class K, class V>
Os& operator<<(Os& os, const std::unordered_map<K, V>& v)
{
    os << '[' << v.size() << "] {";
    bool o{};
    for (const auto& e : v)
        os << (o ? ", " : (o = 1, "")) << e;
    return os << "}\n";
}
 
int main()
{
    std::unordered_map<std::string, int>
        p{{"C", 3}, {"B", 2}, {"A", 1}, {"A", 0}},
        q{{"E", 6}, {"E", 7}, {"D", 5}, {"A", 4}};
 
    std::cout << "p: " << p << "q: " << q;
 
    p.merge(q);
 
    std::cout << "p.merge(q);\n" << "p: " << p << "q: " << q;
}

Mögliche Ausgabe

p: [3] {{A, 1}, {B, 2}, {C, 3}}
q: [3] {{A, 4}, {D, 5}, {E, 6}}
p.merge(q);
p: [5] {{E, 6}, {D, 5}, {A, 1}, {B, 2}, {C, 3}}
q: [1] {{A, 4}}

[bearbeiten] Siehe auch

(C++17)
extrahiert Knoten aus dem Container
(public member function) [edit]
fügt Elemente ein oder Knoten(seit C++17)
(public member function) [edit]