C++ Erase Element From Vector While Iterating

4 min read Jul 03, 2024
C++ Erase Element From Vector While Iterating

Menghapus Elemen dari Vektor C++ Saat Beriterasi

Dalam pemrograman C++, menghapus elemen dari vektor saat beriterasi memerlukan kehati-hatian. Jika Anda menghapus elemen secara langsung saat beriterasi menggunakan iterasi biasa (for), Anda dapat mengalami perilaku yang tidak terdefinisi. Ini karena penghapusan elemen akan mengubah posisi elemen lainnya dalam vektor, dan iterasi Anda mungkin menjadi salah arah.

Berikut adalah beberapa pendekatan yang aman untuk menghapus elemen dari vektor C++ saat beriterasi:

1. Menggunakan Iterator Balik (Reverse Iterator)

  • Anda dapat beriterasi melalui vektor dari belakang ke depan menggunakan iterator balik (rbegin() dan rend()).
  • Dengan cara ini, penghapusan elemen tidak akan mempengaruhi posisi elemen yang Anda iterasi.
#include 
#include 

using namespace std;

int main() {
  vector numbers = {1, 2, 3, 4, 5};

  // Hapus semua angka genap
  for (auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
    if (*it % 2 == 0) {
      numbers.erase(it.base()); // Gunakan 'base()' untuk mendapatkan iterator biasa
    }
  }

  // Cetak vektor yang sudah diubah
  for (int number : numbers) {
    cout << number << " ";
  }
  cout << endl;

  return 0;
}

2. Menggunakan Iterator dan erase()

  • Anda dapat menggunakan iterator erase() untuk menghapus elemen saat beriterasi secara normal.
  • Pastikan untuk menginisialisasi ulang iterator setelah memanggil erase(), karena posisi iterator akan berubah.
#include 
#include 

using namespace std;

int main() {
  vector numbers = {1, 2, 3, 4, 5};

  // Hapus semua angka genap
  for (auto it = numbers.begin(); it != numbers.end(); ) {
    if (*it % 2 == 0) {
      it = numbers.erase(it); // Inisialisasi ulang 'it' setelah penghapusan
    } else {
      ++it;
    }
  }

  // Cetak vektor yang sudah diubah
  for (int number : numbers) {
    cout << number << " ";
  }
  cout << endl;

  return 0;
}

3. Menggunakan remove_if() dan erase()

  • Gunakan remove_if() untuk memindahkan semua elemen yang memenuhi kriteria penghapusan ke akhir vektor.
  • Kemudian, gunakan erase() untuk menghapus semua elemen dari akhir vektor sampai elemen pertama yang tidak memenuhi kriteria.
#include 
#include 
#include 

using namespace std;

int main() {
  vector numbers = {1, 2, 3, 4, 5};

  // Hapus semua angka genap
  numbers.erase(remove_if(numbers.begin(), numbers.end(),  { return num % 2 == 0; }), numbers.end());

  // Cetak vektor yang sudah diubah
  for (int number : numbers) {
    cout << number << " ";
  }
  cout << endl;

  return 0;
}

Kesimpulan

Menghapus elemen dari vektor C++ saat beriterasi dapat dilakukan dengan aman menggunakan beberapa metode. Pilih metode yang paling sesuai dengan kebutuhan Anda dan perhatikan agar iterator selalu diperbarui dengan benar setelah menghapus elemen.

Latest Posts