c++ - 如何将 "const_reverse_iterator"参数传递给 "std::vector::erase()"?

标签 c++ vector iterator erase

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;
}

但是,此示例代码不起作用,因为 是一个反向迭代器,而erase() 不将反向迭代器作为其参数。

如何修改此代码以使其正常工作?

最佳答案

您可以使用 base() 从 reverse_iterators 转换为迭代器,尽管您需要减去一个以获得指向同一元素的迭代器,因此 rbegin() 指向 end() 而 rend() 指向 begin() (因为在现实中不可能指向一个开始之前。

您有更多问题,因为您使用的是 const_reverse_iterator,它不能转换为非常量迭代器,而 erase 需要非常量迭代器。逻辑是您正在修改集合,因此您使用了非常量迭代器。

在你的例子中,你的循环有一个更大的问题,因为你正在删除迭代器从而使它们无效,然后尝试返回到前一个元素。

如果您需要删除最后 3 个元素,那么您应该使用采用范围的删除方法,而不是一次删除一个。

在这种特殊情况下,只要您知道 MyVector.size() >= 3

关于c++ - 如何将 "const_reverse_iterator"参数传递给 "std::vector::erase()"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4625342/

相关文章:

c++ - Qt - 计算机移动时阻止用户界面

c++ - 在 FTP 服务器中实现 "TYPE A"

c++ - 如何修改正则表达式字符串

java - 相对于 x 轴运动镜像

c++有奇怪的问题

c# - 迭代器和枚举器的区别

c++ - 如何通过角度知道三角形是否有效?

c++如何对位集 vector 进行排序?

iterator - 我可以将 Iterator<Item=io::Result<u8>> 转换为 io::Result<Vec<u8>> 而不 panic 吗?

javascript - ES6 使用 for..of 反向迭代数组,我是否遗漏了规范中的内容?