在循环内从向量中删除元素
使用向量时的一个常见任务是根据其属性删除特定元素。但是,在迭代向量时更新向量可能会导致意外错误。
让我们考虑以下代码片段:
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中文网其他相关文章!