Remover elemento do array em C++

Jinku Hu 12 outubro 2023
  1. Use as funções std::to_array e std::remove para remover elemento de um array em C++
  2. Use as funções std::erase e std::remove para remover elemento de um array em C++
Remover elemento do array em C++

Este artigo explicará vários métodos de como remover um elemento de um array em C++.

Use as funções std::to_array e std::remove para remover elemento de um array em C++

Os arrays podem ser definidos como de comprimento fixo ou dinâmico em C++, e ambos precisam de métodos diferentes para a remoção de elementos. Neste exemplo, consideramos as matrizes fixas de estilo C integradas, uma vez que são comumente manipuladas pelos programas numéricos para eficiência.

Declararemos um array de int e removeremos o valor do elemento de 2, que ocorre duas vezes neste array. std::remove faz parte da biblioteca de algoritmos e remove todas as instâncias do elemento fornecido no intervalo especificado.

Embora, em primeiro lugar, convertamos o objeto arr para o recipiente std::array usando a função std::to_array para usar com segurança com o método std::remove. O último algoritmo retorna o iterador para o novo final do intervalo, o que significa que o objeto array resultante ainda contém 10 elementos e precisamos copiá-los para o novo local. Como o objeto original era um array no estilo C, alocamos uma nova memória dinâmica para o array de oito elementos int e usamos a função std::memmove para copiar o conteúdo do objeto array. Lembre-se de que calculamos o valor 8 usando a função 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;
}

Resultado:

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

Use as funções std::erase e std::remove para remover elemento de um array em C++

Outro cenário para esse problema ocorre quando a matriz fornecida é do tipo std::vector. Desta vez, temos os recursos de array dinâmico e é mais flexível usar uma função integrada para manipulações de elementos.

No código de exemplo a seguir, utilizaremos o idioma erase-remove e removeremos todas as ocorrências do elemento fornecido no intervalo. Observe que std::erase leva dois iteradores para denotar o intervalo de remoção. Portanto, ele precisa do valor de retorno do algoritmo std::remove para especificar o ponto de partida. Lembre-se de que, se chamarmos apenas o método std::remove, o objeto arr2 terá elementos como - {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;
}

Resultado:

| 1 | 1 | 1 | 2 | 2 | 6 | 7 | 8 | 9 | 10 |
| 1 | 1 | 1 | 6 | 7 | 8 | 9 | 10 |
Autor: 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

Artigo relacionado - C++ Array