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 & 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!