std::map<Key,T,Compare,Allocator>::insert
| std::pair<iterator, bool> insert( const value_type& value ); |
(1) | |
| template< class P > std::pair<iterator, bool> insert( P&& value ); |
(2) | (seit C++11) |
| std::pair<iterator, bool> insert( value_type&& value ); |
(3) | (seit C++17) |
| (4) | ||
iterator insert( iterator pos, const value_type& value ); |
(bis C++11) | |
| iterator insert( const_iterator pos, const value_type& value ); |
(seit C++11) | |
| template< class P > iterator insert( const_iterator pos, P&& value ); |
(5) | (seit C++11) |
| iterator insert( const_iterator pos, value_type&& value ); |
(6) | (seit C++17) |
| template< class InputIt > void einfügen( InputIt first, InputIt last ); |
(7) | |
| void insert( std::initializer_list<value_type> ilist ); |
(8) | (seit C++11) |
| insert_return_type insert( node_type&& nh ); |
(9) | (seit C++17) |
| iterator insert( const_iterator pos, node_type&& nh ); |
(10) | (seit C++17) |
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 als äquivalent verglichen werden, ist nicht spezifiziert, welches Element eingefügt wird (vorbehaltlich LWG2844).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 |
[edit] Parameter
| pos | - | Iterator zu der Position, vor der das neue Element eingefügt wird |
| value | - | Elementwert, der eingefügt werden soll |
| first, last | - | das Paar von Iteratoren, die den Bereich der einzufügenden Elemente definieren |
| ilist | - | Initialisierungsliste, aus der die Werte eingefügt werden sollen |
| nh | - | ein kompatibler Node Handle |
| Typanforderungen | ||
-InputIt muss die Anforderungen von LegacyInputIterator erfüllen. | ||
[edit] Rückgabewert
insert_return_type mit den folgenden Initialisierungen der Member- 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.
[edit] Ausnahmen
| Dieser Abschnitt ist unvollständig Grund: Fälle 7-10 |
[edit] Komplexität
O(log(size())).O(N·log(size() + N)), wobei N die Anzahl der einzufügenden Elemente ist.O(log(size())).[edit] Anmerkungen
Die mit Hinweis versehene Einfügung (4-6) gibt kein boolesches Ergebnis zurück, um mit der parametrischen Einfügung in sequenzielle Container wie std::vector::insert kompatibel zu sein. Dies ermöglicht die Erstellung generischer Einfügungsfunktionen wie std::inserter. Eine Möglichkeit, den Erfolg einer mit Hinweis versehenen Einfügung zu überprüfen, ist der Vergleich von size() vor und nach der Operation.
[edit] Beispiel
#include <iomanip> #include <iostream> #include <map> #include <string> using namespace std::literals; template<typename It> void print_insertion_status(It it, bool success) { std::cout << "Insertion of " << it->first << (success ? " succeeded\n" : " failed\n"); } int main() { std::map<std::string, float> heights; // Overload 3: insert from rvalue reference const auto [it_hinata, success] = heights.insert({"Hinata"s, 162.8}); print_insertion_status(it_hinata, success); { // Overload 1: insert from lvalue reference const auto [it, success2] = heights.insert(*it_hinata); print_insertion_status(it, success2); } { // Overload 2: insert via forwarding to emplace const auto [it, success] = heights.insert(std::pair{"Kageyama", 180.6}); print_insertion_status(it, success); } { // Overload 6: insert from rvalue reference with positional hint const std::size_t n = std::size(heights); const auto it = heights.insert(it_hinata, {"Azumane"s, 184.7}); print_insertion_status(it, std::size(heights) != n); } { // Overload 4: insert from lvalue reference with positional hint const std::size_t n = std::size(heights); const auto it = heights.insert(it_hinata, *it_hinata); print_insertion_status(it, std::size(heights) != n); } { // Overload 5: insert via forwarding to emplace with positional hint const std::size_t n = std::size(heights); const auto it = heights.insert(it_hinata, std::pair{"Tsukishima", 188.3}); print_insertion_status(it, std::size(heights) != n); } auto node_hinata = heights.extract(it_hinata); std::map<std::string, float> heights2; // Overload 7: insert from iterator range heights2.insert(std::begin(heights), std::end(heights)); // Overload 8: insert from initializer_list heights2.insert({{"Kozume"s, 169.2}, {"Kuroo", 187.7}}); // Overload 9: insert node const auto status = heights2.insert(std::move(node_hinata)); print_insertion_status(status.position, status.inserted); node_hinata = heights2.extract(status.position); { // Overload 10: insert node with positional hint const std::size_t n = std::size(heights2); const auto it = heights2.insert(std::begin(heights2), std::move(node_hinata)); print_insertion_status(it, std::size(heights2) != n); } // Print resulting map std::cout << std::left << '\n'; for (const auto& [name, height] : heights2) std::cout << std::setw(10) << name << " | " << height << "cm\n"; }
Ausgabe
Insertion of Hinata succeeded Insertion of Hinata failed Insertion of Kageyama succeeded Insertion of Azumane succeeded Insertion of Hinata failed Insertion of Tsukishima succeeded Insertion of Hinata succeeded Insertion of Hinata succeeded Azumane | 184.7cm Hinata | 162.8cm Kageyama | 180.6cm Kozume | 169.2cm Kuroo | 187.7cm Tsukishima | 188.3cm
[edit] 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 (7) war als linear gefordert, 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 |
| LWG 2005 | C++11 | die Überladungen (2,5) waren schlecht beschrieben | verbesserte die Beschreibung |
[edit] 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) |
| (C++17) |
fügt ein Element ein oder weist einem vorhandenen Element einen Wert zu, falls der Schlüssel bereits existiert (public member function) |
| erstellt einen std::insert_iterator vom Typ, der aus dem Argument abgeleitet wird (Funktionsvorlage) |