尝试编写一个方法,从std :: map中删除第一个(最低键控的)N个项目.试过这个:
void EraseNMapElements(const int numElementsToRemove){
const int originalSize = _map.size();
auto eraseIter = _map.begin();
std::advance(eraseIter, numElementsToRemove);
_map.erase(_map.begin(), eraseIter);
assert(_map.size() == (originalSize - numElementsToRemove)) || (0 == originalSize) || (0 == _map.size()));
}
Run Code Online (Sandbox Code Playgroud)
当元素数量超过请求删除的数量时,它可以工作.因此,如果我有五个元素,请求删除2,最后3个元素仍然存在.但是,如果我有一个元素并请求擦除2,我仍然剩下一个元素.
有没有一个简洁的方法来涵盖这个?我可以推送一个IF语句来检查numElementsToRemove大于map.size()但是必须有一个更好的解决方案吗?
std::advance(i, n)有一个i至少可以增加n次数的前提条件。在您的代码中,您没有检查该前提条件,因此如果您使用 调用它numElementsToRemove > originalSize,则违反了该前提条件,从而遇到未定义的行为。要解决这个问题,您必须在调用之前进行检查std::advance,也许可以使用std::min:
auto realNumToRemove = std::min(numElementsToRemove, originalSize);
std::advance(eraseIter, realNumToRemove);
Run Code Online (Sandbox Code Playgroud)