在循環內從向量中刪除元素
了解如何在循環迭代期間有效地從向量中刪除元素至關重要。嘗試使用下列程式碼執行此操作可能會導致錯誤:
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); it++) { if(it->getpMoney() <= 0) it = allPlayers.erase(it); else ++it; }
錯誤訊息「operator '=' function is unavailable in 'Player'」表示向量中的物件不能直接重新指派。要解決此問題,Player 類別必須實作賦值運算子 (=)。
此外,應修改for 循環以避免明確遞增迭代器,因為這已在內部處理:
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); ) { if(it->getpMoney() <= 0) it = allPlayers.erase(it); else ++it; }
不要使用原始循環,建議使用擦除刪除慣用法來提高效率:
allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
這個idiom 使用remove_if演算法過濾掉滿足指定條件的元素(在本例中為零錢或負錢的玩家),然後使用erase 函數將它們從向量中刪除。
以上是如何在 C 循環迭代期間安全地從向量中刪除元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!