Supprimer l'élément du tableau en C++
-
Utilisez les fonctions
std::to_array
etstd::remove
pour supprimer un élément d’un tableau en C++ -
Utilisez les fonctions
std::erase
etstd::remove
pour supprimer un élément d’un 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 |
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