Namespaces
Variants

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

From cppreference.net

template < class ... Args >
iterator emplace ( Args && ... args ) ;
(depuis C++11)
(constexpr depuis C++26)

Insère un nouvel élément dans le conteneur construit sur place avec les args donnés.

Le constructeur du nouvel élément est appelé avec exactement les mêmes arguments que ceux fournis à emplace , transmis via std:: forward < Args > ( args ) ... .

Si value_type n'est pas EmplaceConstructible dans multiset à partir de args , le comportement est indéfini.

Aucun itérateur ou référence n'est invalidé.

Table des matières

Paramètres

args - arguments à transmettre au constructeur de l'élément

Valeur de retour

Un itérateur vers l'élément inséré.

Exceptions

Si une exception est levée pour quelque raison que ce soit, cette fonction n'a aucun effet ( garantie forte de sûreté face aux exceptions ).

Complexité

Logarithmique par rapport à la taille du conteneur.

Notes

L'utilisation judicieuse de emplace permet de construire le nouvel élément tout en évitant les opérations inutiles de copie ou de déplacement.

Exemple

#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 << " pour " << 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");
}

Sortie possible :

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

Voir aussi

construit des éléments en place en utilisant un indice
(fonction membre publique)
insère des éléments ou des nœuds (depuis C++17)
(fonction membre publique)