Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengeluarkan Elemen dengan Selamat daripada Vektor Semasa Lelaran dalam C?

Bagaimana untuk Mengeluarkan Elemen dengan Selamat daripada Vektor Semasa Lelaran dalam C?

Barbara Streisand
Barbara Streisandasal
2024-12-04 04:09:13223semak imbas

How to Safely Remove Elements from a Vector During Iteration in C  ?

Alih Keluar Elemen daripada Vektor Dalam Gelung

Apabila melelaran melalui vektor, mungkin terdapat senario di mana anda perlu mengalih keluar elemen berdasarkan kriteria tertentu. Walau bagaimanapun, percubaan untuk mengubah suai vektor semasa lelaran boleh membawa kepada ralat masa jalan.

Pertimbangkan senario berikut:

for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++) {
  if (it->getpMoney() <= 0)
    it = allPlayers.erase(it);
  else
    ++it;
}

Kod ini bertujuan untuk mengalih keluar pemain dengan wang sifar atau negatif. Walau bagaimanapun, ia gagal dengan ralat yang berkaitan dengan pengendali tugasan. Untuk menyelesaikan isu ini, elakkan penambahan iterator dalam gelung. Sebaliknya, bergantung pada iterator yang dikembalikan oleh fungsi erase().

for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) {
  if (it->getpMoney() <= 0)
    it = allPlayers.erase(it);
  else
    ++it;
}

Selain itu, penggunaan operator= oleh fungsi erase() memerlukan kelas Player boleh ditugaskan, bermakna kelas Player mesti melaksanakan pengendali tugasan.

Padam-Alih Keluar Idiom untuk Vektor Manipulasi

Untuk memudahkan tugas mengalih keluar elemen daripada vektor, gunakan Idiom Erase-Remove:

allPlayers.erase(
  std::remove_if(
    allPlayers.begin(),
    allPlayers.end(),
    [](Player const &amp; p) { return p.getpMoney() <= 0; }
  ),
  allPlayers.end()
);

Idiom ini menggabungkan algoritma remove_if() untuk mengenal pasti elemen untuk padam dan kaedah erase() untuk mengalih keluar julat yang diperlukan.

Atas ialah kandungan terperinci Bagaimana untuk Mengeluarkan Elemen dengan Selamat daripada Vektor Semasa Lelaran dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn