Element aus Array entfernen in C++
-
Verwenden der Funktionen
std::to_array
undstd::remove
zum Entfernen eines Elements aus einem Array in C++ -
Verwenden der Funktionen
std::erase
undstd::remove
zum Entfernen von Elementen aus einem Array in C++
In diesem Artikel werden verschiedene Methoden zum Entfernen eines Elements aus einem Array in C++ erläutert.
Verwenden der Funktionen std::to_array
und std::remove
zum Entfernen eines Elements aus einem Array in C++
Arrays können in C++ als fest oder dynamisch definiert werden, und beide benötigen unterschiedliche Methoden zum Entfernen von Elementen. In diesem Beispiel betrachten wir die eingebauten festen Arrays im C-Stil, da diese üblicherweise von den numerischen Programmen aus Effizienzgründen manipuliert werden.
Wir werden ein Array von int
deklarieren und den Elementwert von 2
entfernen, der in diesem Array zweimal vorkommt. std::remove
ist Teil der Algorithmusbibliothek und entfernt alle Instanzen des angegebenen Elements im angegebenen Bereich.
Obwohl wir zunächst das Objekt arr
mit der Funktion std::to_array
in den Container std::array
konvertieren, um es mit der Methode std::remove
sicher zu verwenden. Der letztere Algorithmus gibt den Iterator für das neue Ende des Bereichs zurück, was bedeutet, dass das resultierende array
-Objekt noch 10
-Elemente enthält und wir sie an den neuen Speicherort kopieren müssen. Da das ursprüngliche Objekt ein Array im C-Stil war, weisen wir dem Array mit acht Elementen int
neuen dynamischen Speicher zu und kopieren den Inhalt mit der Funktion std::memmove
aus dem Objekt array
. Beachten Sie jedoch, dass wir den Wert 8
mit der Funktion std::distance
berechnet haben.
#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;
}
Ausgabe:
| 1 | 1 | 1 | 2 | 2 | 6 | 7 | 8 | 9 | 10 |
| 1 | 1 | 1 | 6 | 7 | 8 | 9 | 10 |
Verwenden der Funktionen std::erase
und std::remove
zum Entfernen von Elementen aus einem Array in C++
Ein anderes Szenario für dieses Problem tritt auf, wenn das angegebene Array vom Typ std::vector
ist. Dieses Mal verfügen wir über die Funktionen für dynamische Arrays und es ist flexibler, eine integrierte Funktion für Elementmanipulationen zu verwenden.
Im folgenden Beispielcode verwenden wir das Lösch-Entfernungs-Idiom und entfernen alle Vorkommen des angegebenen Elements im Bereich. Beachten Sie, dass std::erase
zwei Iteratoren benötigt, um den Bereich zum Entfernen anzugeben. Daher benötigt es den Rückgabewert des Algorithmus std::remove
, um den Startpunkt anzugeben. Wenn wir nur die Methode std::remove
aufrufen, hat das Objekt arr2
Elemente wie - {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;
}
Ausgabe:
| 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