std::unordered_set<Key,Hash,KeyEqual,Allocator>:: insert
|
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.
[
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
).
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.
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
Hashsowohl mit dem TypKals auch mit dem TypKeyaufrufbar ist und dass derKeyEqualtransparent ist,
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
insert_return_type
mit den wie folgt initialisierten Mitgliedern:
-
Wenn
nh
leer ist, ist
insertedfalse ,positionist end ( ) , undnodeist leer. -
Andernfalls, wenn die Einfügung stattgefunden hat, ist
insertedtrue ,positionzeigt auf das eingefügte Element, undnodeist leer. -
Wenn die Einfügung fehlgeschlagen ist, ist
insertedfalse ,nodehat den vorherigen Wert von nh , undpositionzeigt auf ein Element mit einem Schlüssel, der äquivalent zu nh. key ( ) ist.
Exceptions
|
Dieser Abschnitt ist unvollständig
Grund: Fälle 5-10 |
Komplexität
O(1)
, schlechtester Fall
O(size())
.
O(N)
, wobei N die Anzahl der einzufügenden Elemente ist. Schlechtester Fall:
O(N * size() + N)
.
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) |