從循環內的向量中刪除元素
迭代向量時,可能存在需要根據以下條件刪除元素的情況:某些標準。但是,嘗試在迭代時修改向量可能會導致運行時錯誤。
考慮以下場景:
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++) { if (it->getpMoney() <= 0) it = allPlayers.erase(it); else ++it; }
此程式碼旨在刪除零錢或負錢的玩家。但是,它會失敗並出現與賦值運算子相關的錯誤。若要解決此問題,請避免在循環內遞增迭代器。相反,依賴erase()函數傳回的迭代器。
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) { if (it->getpMoney() <= 0) it = allPlayers.erase(it); else ++it; }
此外,erase()函數使用operator=要求Player類別是可指派的,這表示Player類別必須實作賦值運算子。
向量的擦除-刪除習語操作
為了簡化從向量中刪除元素的任務,請採用擦除刪除慣用法:
allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
此慣用法結合了remove_if()演算法來辨識要刪除的元素。擦除和擦除()方法刪除所需的範圍。
以上是如何在 C 迭代過程中安全地從向量中刪除元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!