std::vector<T,Allocator>:: emplace_back
|
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 | ||
-
|
||
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) |