Namespaces
Variants

std::vector<T,Allocator>:: emplace_back

From cppreference.net

template < class ... Args >
void emplace_back ( Args && ... args ) ;
(jusqu'à C++17)
template < class ... Args >
reference emplace_back ( Args && ... args ) ;
(depuis C++17)
(constexpr depuis C++20)

Ajoute un nouvel élément à la fin du conteneur. L'élément est construit via std::allocator_traits::construct , qui utilise généralement le placement new pour construire l'élément in-situ à l'emplacement fourni par le conteneur. Les arguments args... sont transmis au constructeur sous la forme std:: forward < Args > ( args ) ... .

Si après l'opération la nouvelle size() est supérieure à l'ancienne capacity() , une réallocation se produit, auquel cas tous les itérateurs (y compris l'itérateur end() ) et toutes les références aux éléments sont invalidés. Sinon, seul l'itérateur end() est invalidé.

Table des matières

Paramètres

args - arguments à transmettre au constructeur de l'élément
Exigences de type
-
Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :

Valeur de retour

(aucun)

(jusqu'en C++17)

Une référence à l'élément inséré.

(depuis C++17)

Complexité

Amorti constant.

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 ). Si le constructeur par déplacement de T n'est pas noexcept et n'est pas CopyInsertable dans * this , vector utilisera le constructeur par déplacement levant une exception. S'il lève une exception, la garantie est annulée et les effets ne sont pas spécifiés.

Notes

Puisqu'une réallocation peut avoir lieu, emplace_back nécessite que le type d'élément soit MoveInsertable pour vector .

Exemple

Le code suivant utilise emplace_back pour ajouter un objet de type President à un std::vector . Il démontre comment emplace_back transmet les paramètres au constructeur de President et montre comment l'utilisation de emplace_back évite l'opération de copie ou de déplacement supplémentaire requise lors de l'utilisation de push_back .

#include <vector>
#include <cassert>
#include <iostream>
#include <string>
struct President
{
    std::string name;
    std::string country;
    int year;
    President(std::string p_name, std::string p_country, int p_year)
        : name(std::move(p_name)), country(std::move(p_country)), year(p_year)
    {
        std::cout << "I am being constructed.\n";
    }
    President(President&& other)
        : name(std::move(other.name)), country(std::move(other.country)), year(other.year)
    {
        std::cout << "I am being moved.\n";
    }
    President& operator=(const President& other) = default;
};
int main()
{
    std::vector<President> elections;
    std::cout << "emplace_back:\n";
    auto& ref = elections.emplace_back("Nelson Mandela", "South Africa", 1994);
    assert(ref.year == 1994 && "uses a reference to the created object (C++17)");
    std::vector<President> reElections;
    std::cout << "\npush_back:\n";
    reElections.push_back(President("Franklin Delano Roosevelt", "the USA", 1936));
    std::cout << "\nContents:\n";
    for (const President& president: elections)
        std::cout << president.name << " was elected president of "
                  << president.country << " in " << president.year << ".\n";
    for (const President& president: reElections)
        std::cout << president.name << " was re-elected president of "
                  << president.country << " in " << president.year << ".\n";
}

Sortie :

emplace_back:
I am being constructed.
push_back:
I am being constructed.
I am being moved.
Contents:
Nelson Mandela was elected president of South Africa in 1994.
Franklin Delano Roosevelt was re-elected president of the USA in 1936.

Voir aussi

ajoute un élément à la fin
(fonction membre publique)
(C++11)
construit un élément en place
(fonction membre publique)