Namespaces
Variants

std::unordered_set<Key,Hash,KeyEqual,Allocator>:: insert

From cppreference.net
std:: pair < iterator, bool > insert ( const value_type & value ) ;
(1) (seit C++11)
std:: pair < iterator, bool > insert ( value_type && value ) ;
(2) (seit C++11)
iterator insert ( const_iterator hint, const value_type & value ) ;
(3) (seit C++11)
iterator insert ( const_iterator hint, value_type && value ) ;
(4) (seit C++11)
template < class InputIt >
void insert ( InputIt first, InputIt last ) ;
(5) (seit C++11)
void insert ( std:: initializer_list < value_type > ilist ) ;
(6) (seit C++11)
insert_return_type insert ( node_type && nh ) ;
(7) (seit C++17)
iterator insert ( const_iterator hint, node_type && nh ) ;
(8) (seit C++17)
template < class K >
std:: pair < iterator, bool > insert ( K && obj ) ;
(9) (seit C++23)
template < class K >
iterator insert ( const_iterator hint, K && obj ) ;
(10) (seit C++23)

Fügt Element(e) in den Container ein, falls der Container noch kein Element mit einem äquivalenten Schlüssel enthält.

1,2) Fügt value ein.
3,4) Fügt value ein, wobei hint als nicht bindende Empfehlung für den Startpunkt der Suche verwendet wird.
5) Fügt Elemente aus dem Bereich [ first , last ) ein. Wenn mehrere Elemente im Bereich Schlüssel enthalten, die äquivalent verglichen werden, ist nicht spezifiziert, welches Element eingefügt wird (ausstehend LWG2844 ).
6) Fügt Elemente aus der Initialisierungsliste ilist ein. Wenn mehrere Elemente im Bereich Schlüssel haben, die äquivalent verglichen werden, ist nicht spezifiziert, welches Element eingefügt wird (ausstehend LWG2844 ).
7) Wenn nh ein leerer node handle ist, tut nichts. Andernfalls fügt das Element, das von nh besessen wird, in den Container ein, falls der Container noch kein Element mit einem Schlüssel enthält, der äquivalent zu nh. key ( ) ist. Das Verhalten ist undefiniert, wenn nh nicht leer ist und get_allocator ( ) ! = nh. get_allocator ( ) .
8) Wenn nh ein leerer node handle ist, tut nichts und gibt den End-Iterator zurück. Andernfalls fügt das Element, das von nh gehalten wird, in den Container ein, falls der Container noch kein Element mit einem Schlüssel enthält, der äquivalent zu nh. key ( ) ist, und gibt den Iterator zurück, der auf das Element mit dem Schlüssel äquivalent zu nh. key ( ) zeigt (unabhängig davon, ob das Einfügen erfolgreich war oder fehlgeschlagen ist). Wenn das Einfügen erfolgreich ist, wird nh verschoben, andernfalls behält es das Eigentum am Element. hint wird als nicht bindende Empfehlung verwendet, wo die Suche beginnen sollte. Das Verhalten ist undefiniert, wenn nh nicht leer ist und get_allocator ( ) ! = nh. get_allocator ( ) .
9) Falls * this bereits ein Element enthält, das transparent als äquivalent zu obj verglichen wird, tut nichts. Andernfalls konstruiert ein Objekt u vom Typ value_type mit std:: forward < K > ( obj ) und fügt dann u in * this ein. Falls equal_range ( u ) ! = hash_function ( ) ( obj ) || contains ( u ) true ist, ist das Verhalten undefiniert. Der value_type muss EmplaceConstructible in unordered_set aus std:: forward < K > ( obj ) sein. Diese Überladung nimmt nur an der Überladungsauflösung teil, falls Hash und KeyEqual beide transparent sind. Dies setzt voraus, dass solch ein Hash mit sowohl K als auch Key aufrufbar ist und dass der KeyEqual transparent ist, was zusammen den Aufruf dieser Funktion ermöglicht, ohne eine Instanz von Key zu konstruieren.
10) Falls * this bereits ein Element enthält, das transparent als äquivalent zu obj verglichen wird, tut dies nichts.

Andernfalls wird ein Objekt u vom Typ value_type mit std:: forward < K > ( obj ) konstruiert und dann u in * this eingefügt. Template:hint wird als unverbindliche Empfehlung verwendet, wo die Suche beginnen sollte. Falls equal_range ( u ) ! = hash_function ( ) ( obj ) || contains ( u ) true ist, ist das Verhalten undefiniert. Der value_type muss EmplaceConstructible in unordered_set aus std:: forward < K > ( obj ) sein. Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn:

  • std:: is_convertible_v < K && , const_iterator > und std:: is_convertible_v < K && , iterator > beide false sind, und
  • Hash :: is_transparent und KeyEqual :: is_transparent gültig sind und jeweils einen Typ bezeichnen. Dies setzt voraus, dass solch ein Hash sowohl mit dem Typ K als auch mit dem Typ Key aufrufbar ist und dass der KeyEqual transparent ist,
was zusammen den Aufruf dieser Funktion ermöglicht, ohne eine Instanz von Key zu konstruieren.

Falls nach dem Vorgang die neue Anzahl der Elemente größer ist als alt max_load_factor() * bucket_count() findet eine Rehash-Operation statt.
Falls Rehashing auftritt (aufgrund der Einfügung), werden alle Iteratoren ungültig. Andernfalls (kein Rehashing) werden Iteratoren nicht ungültig. Wenn die Einfügung erfolgreich ist, werden Zeiger und Referenzen auf das Element, die erhalten wurden während es im Node-Handle gehalten wurde, ungültig, und Zeiger und Referenzen, die auf dieses Element erhalten wurden bevor es extrahiert wurde, werden gültig. (seit C++17)

Inhaltsverzeichnis

Parameter

Hinweis - Iterator, der als Vorschlag dient, wo der Inhalt einzufügen ist
Wert - einzufügender Elementwert
first, last - das Iteratorpaar, das den Quell- Bereich der einzufügenden Elemente definiert
ilist - Initialisierungsliste, aus der die Werte eingefügt werden
nh - ein kompatibles Node Handle
obj - ein Wert beliebigen Typs, der transparent mit einem Schlüssel verglichen werden kann
Typanforderungen
-
InputIt muss die Anforderungen von LegacyInputIterator erfüllen.

Rückgabewert

1,2) Ein Paar bestehend aus einem Iterator zum eingefügten Element (oder zum Element, das die Einfügung verhindert hat) und einem bool -Wert, der auf true gesetzt ist, genau dann wenn die Einfügung stattgefunden hat.
3,4) Ein Iterator zum eingefügten Element oder zum Element, das die Einfügung verhindert hat.
5,6) (keine)
7) Ein Objekt vom Typ insert_return_type mit den wie folgt initialisierten Mitgliedern:
  • Wenn nh leer ist, ist inserted false , position ist end ( ) , und node ist leer.
  • Andernfalls, wenn die Einfügung stattgefunden hat, ist inserted true , position zeigt auf das eingefügte Element, und node ist leer.
  • Wenn die Einfügung fehlgeschlagen ist, ist inserted false , node hat den vorherigen Wert von nh , und position zeigt auf ein Element mit einem Schlüssel, der äquivalent zu nh. key ( ) ist.
8) End-Iterator, wenn nh leer war; Iterator, der auf das eingefügte Element zeigt, wenn eine Einfügung stattgefunden hat, und Iterator, der auf ein Element mit einem Schlüssel zeigt, der äquivalent zu nh. key ( ) ist, wenn es fehlgeschlagen ist.
9) Ein Paar bestehend aus einem Iterator zum eingefügten Element (oder zum Element, das die Einfügung verhindert hat) und einem bool -Wert, der auf true gesetzt ist, genau dann wenn die Einfügung stattgefunden hat.
10) Ein Iterator auf das eingefügte Element oder auf das Element, das die Einfügung verhindert hat.

Exceptions

1-4) Wenn eine Ausnahme durch eine beliebige Operation ausgelöst wird, hat die Einfügung keine Auswirkung.

Komplexität

1-4) Durchschnittlicher Fall: O(1) , schlechtester Fall O(size()) .
5,6) Durchschnittlicher Fall: O(N) , wobei N die Anzahl der einzufügenden Elemente ist. Schlechtester Fall: O(N * size() + N) .
7-10) Durchschnittlicher Fall: O(1) , schlechtester Fall O(size()) .

Hinweise

Das angezeigte Einfügen ( ( 3,4 ) , ( 8 ) und ( 10 ) ) gibt kein Boolean zurück, um signaturkompatibel mit positionellem Einfügen bei sequentiellen Containern wie std::vector::insert zu sein. Dies ermöglicht die Erstellung generischer Einfüger wie std::inserter . Eine Möglichkeit, den Erfolg eines angezeigten Einfügens zu überprüfen, ist der Vergleich von size() vorher und nachher.

Feature-Test Makro Wert Std Funktion
__cpp_lib_associative_heterogeneous_insertion 202311L (C++26) Heterogene Überladungen für die verbleibenden Memberfunktionen in geordneten und ungeordneten assoziativen Containern . ( 9,10 )

Beispiel

#include <array>
#include <iostream>
#include <unordered_set>
std::ostream& operator<<(std::ostream& os, std::unordered_set<int> const& s)
{
    for (os << '[' << s.size() << "] { "; int i : s)
        os << i << ' ';
    return os << "}\n";
}
int main ()
{
    std::unordered_set<int> nums{2, 3, 4};
    std::cout << "1) Initially: " << nums << std::boolalpha;
    auto p = nums.insert(1); // insert element, overload (1)
    std::cout << "2) '1' was inserted: " << p.second << '\n';
    std::cout << "3) After insertion: " << nums;
    nums.insert(p.first, 0); // insert with hint, overload (3)
    std::cout << "4) After insertion: " << nums;
    std::array<int, 4> a = {10, 11, 12, 13};
    nums.insert(a.begin(), a.end()); // insert range, overload (5)
    std::cout << "5) After insertion: " << nums;
    nums.insert({20, 21, 22, 23}); // insert initializer_list, (6)
    std::cout << "6) After insertion: " << nums;
    std::unordered_set<int> other_nums = {42, 43};
    auto node = other_nums.extract(other_nums.find(42));
    nums.insert(std::move(node)); // insert node, overload (7)
    std::cout << "7) After insertion: " << nums;
    node = other_nums.extract(other_nums.find(43));
    nums.insert(nums.begin(), std::move(node)); // insert node with hint, (8)
    std::cout << "8) After insertion: " << nums;
}

Mögliche Ausgabe:

1) Initially: [3] { 4 3 2 }
2) '1' was inserted: true
3) After insertion: [4] { 1 2 3 4 }
4) After insertion: [5] { 0 1 2 3 4 }
5) After insertion: [9] { 13 12 11 10 4 3 2 1 0 }
6) After insertion: [13] { 23 22 13 12 11 10 21 4 20 3 2 1 0 }
7) After insertion: [14] { 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }
8) After insertion: [15] { 43 42 23 22 13 12 11 10 21 4 20 3 2 1 0 }

Siehe auch

Konstruiert Element direkt
(öffentliche Elementfunktion)
Konstruiert Elemente direkt unter Verwendung eines Hinweises
(öffentliche Elementfunktion)
erstellt einen std::insert_iterator vom vom Argument abgeleiteten Typ
(Funktionstemplate)