Supprimer l'élément du tableau en C++

Jinku Hu 12 octobre 2023
  1. Utilisez les fonctions std::to_array et std::remove pour supprimer un élément d’un tableau en C++
  2. Utilisez les fonctions std::erase et std::remove pour supprimer un élément d’un tableau en C++
Supprimer l'élément du tableau en C++

Cet article explique plusieurs méthodes de suppression d’un élément d’un tableau en C++.

Utilisez les fonctions std::to_array et std::remove pour supprimer un élément d’un tableau en C++

Les tableaux peuvent être définis comme de longueur fixe ou dynamique en C++, et les deux nécessitent des méthodes différentes pour la suppression des éléments. Dans cet exemple, nous considérons les tableaux fixes intégrés de style C, car ils sont généralement manipulés par les programmes numériques pour plus d’efficacité.

Nous allons déclarer un tableau de int et supprimer la valeur d’élément 2, qui apparaît deux fois dans ce tableau. std::remove fait partie de la bibliothèque d’algorithmes et supprime toutes les instances de l’élément donné dans la plage spécifiée.

Bien que, dans un premier temps, nous convertissions l’objet arr en conteneur std::array en utilisant la fonction std::to_array afin de l’utiliser en toute sécurité avec la méthode std::remove. Ce dernier algorithme renvoie l’itérateur de la nouvelle fin de la plage, ce qui signifie que l’objet tableau résultant contient toujours 10 éléments, et nous devons les copier au nouvel emplacement. Puisque l’objet original était un tableau de style C, nous allouons une nouvelle mémoire dynamique pour le tableau à huit éléments int et utilisons la fonction std::memmove pour copier le contenu de l’objet array. Notez cependant que nous avons calculé la valeur 8 en utilisant la fonction std::distance.

#include <array>
#include <cstring>
#include <iostream>
#include <iterator>

using std::array;
using std::cout;
using std::endl;
using std::remove;

int main() {
  int arr[10] = {1, 1, 1, 2, 2, 6, 7, 8, 9, 10};
  int elem_to_remove = 2;

  cout << "| ";
  for (const auto &item : arr) {
    cout << item << " | ";
  }
  cout << endl;

  auto tmp = std::to_array(arr);
  auto len =
      std::distance(tmp.begin(), (tmp.begin(), tmp.end(), elem_to_remove));
  auto new_arr = new int[len];
  std::memmove(new_arr, tmp.data(), len * sizeof(int));

  cout << "| ";
  for (int i = 0; i < len; ++i) {
    cout << new_arr[i] << " | ";
  }
  cout << endl;

  delete[] new_arr;

  return EXIT_SUCCESS;
}

Production:

| 1 | 1 | 1 | 2 | 2 | 6 | 7 | 8 | 9 | 10 |
| 1 | 1 | 1 | 6 | 7 | 8 | 9 | 10 |

Utilisez les fonctions std::erase et std::remove pour supprimer un élément d’un tableau en C++

Un autre scénario pour ce problème se produit lorsque le tableau donné est de type std::vector. Cette fois, nous avons les fonctionnalités de tableau dynamique, et il est plus flexible d’utiliser une fonction intégrée pour les manipulations d’éléments.

Dans l’exemple de code suivant, nous utiliserons l’idiome erase-remove et supprimerons toutes les occurrences de l’élément donné dans la plage. Notez que std::erase prend deux itérateurs pour désigner la plage à supprimer. Ainsi, il a besoin de la valeur de retour de l’algorithme std::remove pour spécifier le point de départ. Attention, si nous appelons uniquement la méthode std::remove, l’objet arr2 aura des éléments comme - {1, 1, 1, 6, 7, 8, 9, 10, 9, 10}.

#include <iostream>
#include <iterator>
#include <vector>

using std::cout;
using std::endl;
using std::remove;
using std::vector;

int main() {
  vector<int> arr2 = {1, 1, 1, 2, 2, 6, 7, 8, 9, 10};
  int elem_to_remove = 2;

  cout << "| ";
  for (const auto &item : arr2) {
    cout << item << " | ";
  }
  cout << endl;

  arr2.erase(std::remove(arr2.begin(), arr2.end(), elem_to_remove), arr2.end());

  cout << "| ";
  for (const auto &item : arr2) {
    cout << item << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Production:

| 1 | 1 | 1 | 2 | 2 | 6 | 7 | 8 | 9 | 10 |
| 1 | 1 | 1 | 6 | 7 | 8 | 9 | 10 |
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ Array