在循環內從向量中刪除元素
使用向量時的一個常見任務是根據其屬性刪除特定元素。但是,在迭代向量時更新向量可能會導致意外錯誤。
讓我們考慮以下程式碼片段:
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'
錯誤原因:
出現這個錯誤是因為std::vector::erase 內部使用賦值運算子(=)來移動向量內的元素。要使用擦除,Player 類別必須實作賦值運算子。
不使用賦值運算子的解決方案:
要避免賦值運算子要求,請註解掉循環:
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) { if (it->getpMoney() <= 0) it = allPlayers.erase(it); }
透過刪除it增量,迭代器在每次擦除後自動前進
使用Erase-Remove Idiom 進行重構:
更簡潔的解決方案是使用Erase-Remove Idiom,它提供了一種簡潔有效的方法來從向量:
allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
在這種方法中,std::remove_if 根據提供的篩選向量拉姆達表達式。然後使用 std::vector::erase 刪除過濾後的元素。
以上是如何在 C 循環中安全地從向量中刪除元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!