Comprendre vector::insert() en C++ : syntaxe, usages et limites

Comprendre vector::insert() en C++ : syntaxe, usages et limites

Amine Abidi - Lead Software Engineer C++/Qt - Co-fondateur PointerLab

Publié par Amine Abidi - Lead Software Engineer C++/Qt - Co-fondateur PointerLab

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

  1. Que retourne vector::insert() ? ✅ Réponse : Un itérateur vers le premier élément inséré

  2. L'insertion à vector.end() est-elle autorisée ? ✅ Réponse : Oui, c'est parfaitement valide

  3. 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

  4. 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++.

Rejoignez la communauté C++ 🇫🇷 sur Discord !

Un espace convivial pour échanger et apprendre ensemble.