std::vector::erase()
不接受反向迭代器。
有没有办法用反向迭代器调用这个方法?
我的示例代码是:
std::vector<int> MyVector;
for (int i=0; i<10; i++)
{
MyVector.push_back(i);
}
// Now suppose that I want to erase the last three elements
int nEraseCount = 0;
for (std::vector<int>::const_reverse_iterator it=MyVector.rbegin();
it<MyVector.rend(); ++it)
{
MyVector.erase(it);
if (++nEraseCount == 3) break;
}
但是,此示例代码不起作用,因为
it
是一个反向迭代器,而 erase()
不将反向迭代器作为其参数。如何修改此代码以使其正常工作?
最佳答案
您可以使用 base() 从 reverse_iterators 转换为迭代器,尽管您需要减去一个以获得指向相同元素的那个,因此 rbegin() 指向 end() 并且 rend() 指向 begin() (因为它不是可能在现实中的开始之前指向一个)。
您有更多问题,因为您使用的是 const_reverse_iterator,它无法转换为非常量迭代器,并且擦除需要非常量迭代器。逻辑是您正在修改集合,因此您使用非常量迭代器。
在您的情况下,您的循环有一个更大的问题,因为您正在删除迭代器从而使它们无效,然后尝试移回前一个元素。
如果您需要删除最后 3 个元素,那么您应该使用采用范围的擦除方法,而不是一次删除一个。
这可以在这种特殊情况下使用 MyVector.erase(MyVector.rbegin() + 3).base(), MyVector.end() )
完成,只要您知道 MyVector.size() >= 3
关于c++ - 如何将 "const_reverse_iterator"参数传递给 "std::vector::erase()"?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4625342/