从循环内的向量中删除元素
迭代向量时,可能存在需要根据以下条件删除元素的情况:某些标准。但是,尝试在迭代时修改向量可能会导致运行时错误。
考虑以下场景:
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中文网其他相关文章!