3

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()并且没有将反向迭代器作为其参数。

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

4

5 回答 5

7

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

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

在您的情况下,您的循环存在更大的问题,因为您正在删除迭代器从而使它们无效,然后尝试移回前一个元素。

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

MyVector.erase(MyVector.rbegin() + 3).base(), MyVector.end() )只要您知道,就可以在这种特殊情况下使用MyVector.size() >= 3

于 2011-01-07T12:20:43.947 回答
5

I would workaround the problem by not using a reverse iterator. I'll probably write something like that:

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;
while (nEraseCount < 3 && !MyVector.empty())
{
    MyVector.pop_back();
    ++nEraseCount;
}
于 2011-01-07T12:30:54.917 回答
4

好的,你有几个选择 - 你从最后开始擦除 - 所以你可以:

resize()

if (MyVector.size() > 3)
  MyVector.resize(MyVector.size() - 3);
else
  MyVector.clear(); // presumably you don't want all anyway!

简单的区别

if (MyVector.size() > 3)
  MyVector.erase(MyVector.end() - 3, MyVector.end());
else
  MyVector.clear(); // presumably you don't want all anyway!

你采取的方法不是很地道

于 2011-01-07T12:46:09.637 回答
3

如果你只想删除后面的 N 个元素:

size_t N = 3;
size_t to_remove = std::min(vec.size(), N);
vec.erase(vec.end() - to_remove, vec.end());
于 2011-01-07T12:46:02.293 回答
1

你不能通过const_iteratoror const_reverse_iteratorto erase(),因为它是只读迭代器!

您应该使用非常量前向迭代器版本:std::vector<int>::iterator

于 2011-01-07T12:16:43.853 回答