Namensräume
Varianten
Aktionen

std::multiset<Key,Compare,Allocator>::emplace

Von cppreference.com
< cpp‎ | container‎ | multiset
 
 
 
 
template< class... Args >
iterator emplace( Args&&... args );
(seit C++11)

Fügt ein neues Element in den Container ein, das mit den gegebenen args vor Ort konstruiert wird.

Der Konstruktor des neuen Elements wird mit exakt denselben Argumenten aufgerufen, die an emplace übergeben wurden, weitergeleitet über std::forward<Args>(args)....

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 Iterator zu dem eingefügten Element.

[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::multiset<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::multiset<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

499.61ms for cache warming...
447.89ms for insert
436.77ms for insert
430.62ms for emplace
428.61ms for emplace

[bearbeiten] Siehe auch

konstruiert Elemente "in place" unter Verwendung eines Hinweises
(public member function) [edit]
fügt Elemente ein oder Knoten(seit C++17)
(public member function) [edit]