std::flat_map<Key,T,Compare,KeyContainer,MappedContainer>::emplace
| template< class... Args > std::pair<iterator, bool> emplace( Args&&... args ); |
(seit C++23) | |
Fügt ein neues Element in den Container ein, das mit den gegebenen args direkt konstruiert wird, falls kein Element mit diesem Schlüssel im Container vorhanden ist.
Initialisiert ein Objekt t vom Typ std::pair<key_type, mapped_type> mit std::forward<Args>(args)...; falls die Map bereits ein Element enthält, dessen Schlüssel äquivalent zu t.first ist, bleibt *this unverändert. Andernfalls äquivalent zu
auto key_it = ranges::upper_bound(c.keys, t.first, compare); auto value_it = c.values.begin() + std::distance(c.keys.begin(), key_it); c.keys.insert(key_it, std::move(t.first)); c.values.insert(value_it, std::move(t.second));
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_constructible_v<std::pair<key_type, mapped_type>, Args...> true ist.
Eine sorgfältige Verwendung von emplace ermöglicht die Konstruktion des neuen Elements unter Vermeidung unnötiger Kopier- oder Verschiebungsoperationen.
| Informationen zur Iterator-Invalidierung sind von hier kopiert. |
Inhalt |
[bearbeiten] Parameter
| args | - | Argumente, die an den Konstruktor des Elements weitergeleitet werden |
[bearbeiten] Rückgabewert
Ein Paar, das aus einem Iterator zu dem eingefügten Element (oder zu dem Element, das die Einfügung verhindert hat) und einem bool-Wert besteht, der genau dann true ist, wenn die Einfügung stattgefunden hat.
[bearbeiten] Ausnahmen
Wenn aus irgendeinem Grund eine Ausnahme ausgelöst wird, hat diese Funktion keine Auswirkungen (starkes Ausnahmesicherheitsgarantie).
[bearbeiten] Komplexität
Wenn die Einfügung erfolgt, linear zur Größe des Containers, andernfalls logarithmisch zur Größe des Containers
[bearbeiten] Beispiel
#include <iostream> #include <string> #include <utility> #include <flat_map> int main() { std::flat_map<std::string, std::string> m; // uses pair's move constructor m.emplace(std::make_pair(std::string("a"), std::string("a"))); // uses pair's converting move constructor m.emplace(std::make_pair("b", "abcd")); // uses pair's template constructor m.emplace("d", "ddd"); // emplace with duplicate key has no effect m.emplace("d", "DDD"); // uses pair's piecewise constructor m.emplace(std::piecewise_construct, std::forward_as_tuple("c"), std::forward_as_tuple(10, 'c')); // an alternative is: m.try_emplace("c", 10, 'c'); for (const auto& p : m) std::cout << p.first << " => " << p.second << '\n'; }
Ausgabe
a => a b => abcd c => cccccccccc d => ddd
[bearbeiten] Siehe auch
| konstruiert Elemente "in place" unter Verwendung eines Hinweises (public member function) | |
| fügt "in place" ein, wenn der Schlüssel nicht existiert, tut nichts, wenn der Schlüssel existiert (public member function) | |
| fügt Elemente ein (public member function) |