La fonction insert()
de la classe std::vector
permet d'ajouter un ou plusieurs éléments à une position spécifique dans un vecteur. Contrairement à push_back()
, elle ne se limite pas à la fin du conteneur.
Objectif de vector::insert() en C++
insert()
sert à insérer :
- un seul élément,
- plusieurs copies d'un élément,
- une plage d'éléments depuis un autre conteneur,
- ou une liste d'initialisation.
Elle fait partie des fonctionnalités offertes par la STL (Standard Template Library), une bibliothèque puissante en C++ pour manipuler des conteneurs et des algorithmes. Pour en savoir plus sur la STL, consultez notre article : Introduction à la STL en C++.
Elle modifie la structure du vecteur en réorganisant les éléments si nécessaire.
Syntaxes disponibles
La fonction est surchargée. Voici ses différentes formes :
// Insérer un élément
iterator insert(iterator pos, const T& value);
// Insérer plusieurs copies d'un même élément
iterator insert(iterator pos, size_type count, const T& value);
// Insérer une plage d'éléments
template< class InputIt >
iterator insert(iterator pos, InputIt first, InputIt last);
// Insérer via une liste d'initialisation (depuis C++11)
iterator insert(iterator pos, std::initializer_list<T> ilist);
Chaque appel retourne un itérateur vers le premier élément inséré.
Exemples pratiques
Insertion d'un seul élément
std::vector<int> v = {1, 2, 4};
v.insert(v.begin() + 2, 3); // v = {1, 2, 3, 4}
Insertion multiple d'un même élément
std::vector<int> v = {1, 2, 5};
v.insert(v.begin() + 2, 2, 3); // v = {1, 2, 3, 3, 5}
Insertion depuis un autre vecteur
std::vector<int> v1 = {1, 2, 5};
std::vector<int> v2 = {3, 4};
v1.insert(v1.begin() + 2, v2.begin(), v2.end()); // v1 = {1, 2, 3, 4, 5}
Insertion via une liste d'initialisation
std::vector<int> v = {1, 2, 6};
v.insert(v.begin() + 2, {3, 4, 5}); // v = {1, 2, 3, 4, 5, 6}
Comportement et contraintes
Performance
- L'insertion peut entraîner un décalage de tous les éléments situés après la position cible
- Si la capacité du vecteur est dépassée, une réallocation complète a lieu
- L'opération peut avoir une complexité linéaire dans le pire des cas
Invalidité des itérateurs
- Tout itérateur, pointeur ou référence peut devenir invalide après une insertion
- Une réallocation invalide tous les itérateurs
- Sans réallocation, seuls ceux après le point d'insertion sont invalidés
Sécurité et cohérence
- L'insertion à la position
end()
est valide - Il est recommandé d'utiliser
reserve()
avant de nombreuses insertions
Bonnes pratiques
- Prévoir la taille cible avec
reserve()
- Ne jamais conserver des itérateurs entre deux insertions
- Utiliser
push_back()
pour une insertion simple à la fin du vecteur
Quiz : Auto-évaluation
-
Que retourne vector::insert() ? ✅ Réponse : Un itérateur vers le premier élément inséré
-
L'insertion à vector.end() est-elle autorisée ? ✅ Réponse : Oui, c'est parfaitement valide
-
Quelle méthode est plus efficace pour insérer à la fin d'un vector ? ✅ Réponse :
push_back(value)
car elle est optimisée pour l'ajout en fin de séquence -
Que se passe-t-il avec les itérateurs après un insert() ? ✅ Réponse : Ils deviennent invalides si une réallocation a lieu
In a Nutshell : Insert in Vector C++
La fonction insert()
de std::vector
en C++ est une méthode puissante pour insérer des éléments à une position spécifique dans un vecteur. Elle permet d'ajouter un seul élément, plusieurs copies, une plage d'éléments ou une liste d'initialisation. Bien que flexible, elle peut invalider les itérateurs et entraîner des réallocations coûteuses si la capacité du vecteur est dépassée. Pour des insertions optimisées, utilisez reserve()
et préférez push_back()
pour ajouter des éléments en fin de vecteur. Cette méthode est essentielle pour maîtriser la gestion des vecteurs en C++.