std::set<Key,Compare,Allocator>::emplace
| template< class... Args > std::pair<iterator, bool> emplace( Args&&... args ); |
(seit C++11) | |
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.
Der Konstruktor des neuen Elements wird mit exakt denselben Argumenten aufgerufen, die an emplace übergeben wurden, weitergeleitet über std::forward<Args>(args).... Das Element kann auch dann konstruiert werden, wenn sich bereits ein Element mit demselben Schlüssel im Container befindet. In diesem Fall wird das neu konstruierte Element sofort zerstört.
Eine sorgfältige Verwendung von emplace ermöglicht die Konstruktion des neuen Elements unter Vermeidung unnötiger Kopier- oder Verschiebungsoperationen.
Keine Iteratoren oder Referenzen werden ungültig.
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
Logarithmisch zur Größe des Containers.
[bearbeiten] Beispiel
#include <chrono> #include <cstddef> #include <functional> #include <iomanip> #include <iostream> #include <string> #include <set> class Dew { private: int a, b, c; public: Dew(int _a, int _b, int _c) : a(_a), b(_b), c(_c) {} bool operator<(const Dew& other) const { return (a < other.a) || (a == other.a && b < other.b) || (a == other.a && b == other.b && c < other.c); } }; constexpr int nof_operations{101}; std::size_t set_emplace() { std::set<Dew> set; for (int i = 0; i < nof_operations; ++i) for (int j = 0; j < nof_operations; ++j) for (int k = 0; k < nof_operations; ++k) set.emplace(i, j, k); return set.size(); } std::size_t set_insert() { std::set<Dew> set; for (int i = 0; i < nof_operations; ++i) for (int j = 0; j < nof_operations; ++j) for (int k = 0; k < nof_operations; ++k) set.insert(Dew(i, j, k)); return set.size(); } void time_it(std::function<int()> set_test, std::string what = "") { const auto start = std::chrono::system_clock::now(); const auto the_size = set_test(); const auto stop = std::chrono::system_clock::now(); const std::chrono::duration<double, std::milli> time = stop - start; if (!what.empty() && the_size) std::cout << std::fixed << std::setprecision(2) << time << " for " << what << '\n'; } int main() { time_it(set_insert, "cache warming..."); time_it(set_insert, "insert"); time_it(set_insert, "insert"); time_it(set_emplace, "emplace"); time_it(set_emplace, "emplace"); }
Mögliche Ausgabe
630.58ms for cache warming... 577.16ms for insert 560.84ms for insert 547.10ms for emplace 549.44ms for emplace
[bearbeiten] Siehe auch
| (C++11) |
konstruiert Elemente "in place" unter Verwendung eines Hinweises (public member function) |
| fügt Elemente ein oder Knoten(seit C++17) (public member function) |