std::set<Key,Compare,Allocator>::insert
| std::pair<iterator, bool> insert( const value_type& value ); |
(1) | |
| std::pair<iterator, bool> insert( value_type&& value ); |
(2) | (seit C++11) |
| (3) | ||
iterator insert( iterator pos, const value_type& value ); |
(bis C++11) | |
| iterator insert( const_iterator pos, const value_type& value ); |
(seit C++11) | |
| iterator insert( const_iterator pos, value_type&& value ); |
(4) | (seit C++11) |
template< class InputIt > void insert( InputIt first, InputIt last ); |
(5) | |
| 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 pos, node_type&& nh ); |
(8) | (seit C++17) |
template< class K > std::pair<iterator, bool> insert( K&& x ); |
(9) | (seit C++23) |
| template< class K > iterator insert( const_iterator pos, K&& x ); |
(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 haben, die äquivalent vergleichbar sind, ist es nicht spezifiziert, welches Element eingefügt wird (abhängig von LWG2844).u vom value_type mit std::forward<K>(x) konstruiert und dann u in *this eingefügt. Wenn equal_range(u) == equal_range(x) false ist, ist das Verhalten undefiniert. Der value_type muss aus std::forward<K>(x) in set EmplaceConstructible sein. Dieser Überladungsaufruf nimmt nur an der Auflösung teil, wenn der qualifizierte Bezeichner Compare::is_transparent gültig ist und einen Typ bezeichnet. Er ermöglicht das Aufrufen dieser Funktion, ohne eine Instanz von Key zu konstruieren.u vom value_type mit std::forward<K>(x) konstruiert und dann u in *this an einer Position eingefügt, die so nah wie möglich an der Position direkt vor pos liegt. Wenn equal_range(u) == equal_range(x) false ist, ist das Verhalten undefiniert. Der value_type muss aus std::forward<K>(x) in set EmplaceConstructible sein. Dieser Überladungsaufruf nimmt nur an der Auflösung teil, wenn- std::is_convertible_v<K&&, const_iterator> und std::is_convertible_v<K&&, iterator> beide false sind, und
- der qualifizierte Bezeichner Compare::is_transparent gültig ist und einen Typ bezeichnet,
Key zu konstruieren.Keine Iteratoren oder Referenzen werden 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 auf dieses Element, die vor der Extraktion erhalten wurden, werden gültig.(seit C++17)
Inhalt |
[bearbeiten] Parameter
| pos | - | Iterator zu der Position, vor der das neue Element eingefügt wird |
| value | - | Elementwert, der eingefügt werden soll |
| first, last | - | das Iteratorenpaar, das den Quell- Bereich der einzufügenden Elemente definiert |
| ilist | - | Initialisierungsliste, aus der die Werte eingefügt werden sollen |
| nh | - | ein kompatibler Node Handle |
| x | - | ein Wert eines beliebigen Typs, der transparent mit einem Schlüssel verglichen werden kann |
| Typanforderungen | ||
-InputIt muss die Anforderungen von LegacyInputIterator erfüllen. | ||
[bearbeiten] 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.
[bearbeiten] Ausnahmen
| Dieser Abschnitt ist unvollständig Grund: Fälle 5-8, 9, 10 |
[bearbeiten] Komplexität
O(log(size())).O(N·log(size() + N)), wobei N die Anzahl der einzufügenden Elemente ist.O(log(size())).O(log(size())).[bearbeiten] Hinweise
Die mit einem Hinweis versehene Einfügung (3,4) gibt kein boolesches Ergebnis zurück, um signaturkompatibel mit positionsbasierter Einfügung in sequenzielle Container wie std::vector::insert zu sein. Dies ermöglicht die Erstellung generischer Einfüger wie std::inserter. Eine Möglichkeit, den Erfolg einer mit einem Hinweis versehenen Einfügung zu überprüfen, ist der Vergleich von size() vor und nach der Operation.
Die Überladungen (5,6) werden oft als Schleife implementiert, die die Überladung (3) mit end() als Hinweis aufruft. Sie sind für das Anhängen einer sortierten Sequenz (wie ein anderer std::set) optimiert, deren kleinstes Element größer ist als das letzte Element in *this.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_associative_heterogeneous_insertion |
202311L |
(C++26) | Heterogene Überladungen für die verbleibenden Memberfunktionen in geordneten und ungeordneten assoziativen Containern. (9,10) |
[bearbeiten] Beispiel
#include <cassert> #include <iostream> #include <set> int main() { std::set<int> set; auto result_1 = set.insert(3); assert(result_1.first != set.end()); // it is a valid iterator assert(*result_1.first == 3); if (result_1.second) std::cout << "insert done\n"; auto result_2 = set.insert(3); assert(result_2.first == result_1.first); // same iterator assert(*result_2.first == 3); if (!result_2.second) std::cout << "no insertion\n"; }
Ausgabe
insert done no insertion
[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 233 | C++98 | pos war nur ein Hinweis, er konnte komplett ignoriert werden | die Einfügung musste so nah wie möglich an der Position direkt vor pos erfolgen |
| LWG 264 | C++98 | die Komplexität der Überladung (5) sollte linear sein, wenn der Bereich [first, last) gemäß Compare sortiert ist. |
die lineare Anforderung entfernt in diesem Sonderfall |
| LWG 316 | C++98 | im Rückgabewert der Überladung (1) war nicht spezifiziert, welcher bool-Wert eine erfolgreiche Einfügung anzeigt. |
Erfolg wird durch true angezeigt. |
[bearbeiten] Siehe auch
| (C++11) |
konstruiert Elemente direkt (in-place) (public member function) |
| (C++11) |
konstruiert Elemente "in place" unter Verwendung eines Hinweises (public member function) |
| erstellt einen std::insert_iterator vom Typ, der aus dem Argument abgeleitet wird (Funktionsvorlage) |