C++ 我如何通过a";常量“反向迭代器”;参数设置为";std::vector::erase();?

C++ 我如何通过a";常量“反向迭代器”;参数设置为";std::vector::erase();?,c++,vector,iterator,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<

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;
}
std::vector MyVector;

对于(int i=0;i您不能将
const\u迭代器
const\u reverse\u迭代器
传递到
erase()
,因为它是只读的迭代器


您应该使用非常量正向迭代器版本:
std::vector::iterator

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

问题更大,因为您使用的是常量反常量迭代器,无法转换为非常量迭代器,而erase需要非常量迭代器。逻辑是您正在修改集合,因此使用非常量迭代器

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

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


这可以使用
MyVector.erase(MyVector.rbegin()+3.base(),MyVector.end())
在这种特殊情况下完成,只要您知道
MyVector.size()>=3
我会通过不使用反向迭代器来解决这个问题。我可能会这样写:

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;
}
std::vector MyVector;

对于(int i=0;i如果您只想删除后面的N个元素:

size_t N = 3;
size_t to_remove = std::min(vec.size(), N);
vec.erase(vec.end() - to_remove, vec.end());

好的,您有几个选项-您正在从末尾擦除-因此您可以:

resize()

简单差异

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

您所采用的方法不是很惯用

即使迭代器是兼容的,擦除也会使迭代器失效并导致迭代失败。最好使用remove-erase惯用法!您的代码是一个需要反向迭代器的简化示例,还是您正试图从向量中删除最后三个元素?我应该编写什么我的代码中“MyVector.erase(it);”的d?如果删除一个范围,则获取整个范围,然后调用需要2个迭代器的erase版本。如果基于谓词删除,则使用erase/remove_Ifidiom@Downvoter:请指定原因。至少让我知道我错在哪里!
erase
需要
iterator
参数,而不是
const_iterator
-所以你几乎所有的答案都是错的。@Joe:我也发布了函数签名。请看。这两者都可以使用!它在C++98和C++03中使用iterator-在C++0x中使用const_iterator。@Nawaz,除非它是编译器特定的,
erase()
需要一个非
常量迭代器
。如果试图将
常量迭代器
传递到擦除中,则会出现编译错误。请参见:呃,为什么?
resize()
是修剪时所需的全部内容!我想他在删除它们之前必须对该项进行一些处理。如果不是这样,请执行
resize()
是一种更有效的解决方案。
if (MyVector.size() > 3)
  MyVector.erase(MyVector.end() - 3, MyVector.end());
else
  MyVector.clear(); // presumably you don't want all anyway!