从循环内的向量中删除元素
使用 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中文网其他相关文章!