從循環內的向量中刪除元素
使用for 循環迭代向量時,常見的任務是刪除基於循環的元素根據具體標準。但是,嘗試刪除循環本身內的元素可能會導致錯誤。
考慮以下程式碼:
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物件必須是可分配的,需要為Player類別實作operator=。
解決方案
要解決此問題,避免在 for 迴圈中遞增它:
for (vector<Player>::iterator it = allPlayers.begin(); it != allPlayers.end(); /*it++*/) { if(it->getpMoney() <= 0) it = allPlayers.erase(it); }
為 Player 類別實作 operator=以便能夠在
使用演算法的替代方法
為了簡化程式碼,請考慮使用擦除刪除慣用法:
allPlayers.erase( std::remove_if( allPlayers.begin(), allPlayers.end(), [](Player const & p) { return p.getpMoney() <= 0; } ), allPlayers.end() );
此程式碼採用std::remove_if() 演算法過濾掉負數或零錢的玩家,然後使用擦除()將其從向量。
以上是在 C 中迭代時如何安全地從向量中刪除元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!