为什么我不能删除向量的最后一个元素

时间:2011-03-07 21:05:02

标签: c++ stl vector iterator

我有几个元素组成的stl向量。我需要迭代这个向量并删除符合某些条件的元素。所以我写了这段代码

for (int j = imageDataVector.size()-1; j >= 0; j--) {
    if(imageDataVector[i] < threshold)
        imageDataVector.erase(imageDataVector.end() - j);
}

此代码适用于几乎所有情况,但是如果向量的所有元素都符合条件,则会出现错误:

vector erase iterator outside the range

如果向量中只剩下一个元素,则会发生此错误。我做错了什么?

3 个答案:

答案 0 :(得分:11)

if(imageDataVector[i] < threshold)
        imageDataVector.erase(imageDataVector.end()-j);

应该是:

if(imageDataVector[j] < threshold)
        imageDataVector.erase(imageDataVector.begin()+j);

编辑:为了完整性,删除删除方式和迭代方式:

imageDataVector.erase(std::remove_if(imageDataVector.begin(), imageDataVector.end(), std::bind2nd(std::less<vector_data_type>(), threshold)), imageDataVector.end());

vector<type>::iterator it = imageDataVector.begin();
while (it != imageDataVector.end()) {
  if (*it < threshold)
    it = imageDataVector.erase(it);
  else
    ++it;
}

答案 1 :(得分:6)

你正在混合前后索引。

我会考虑改用std::remove_if。这样,如果您要移除多个元素,则不会在每次擦除时向前移动整个向量。

它看起来像这样:

imageDataVector.erase(std::remove_if(imageDataVector.begin(), imageDataVector.end(), std::bind2nd(std::less<data_type>(), threshold)), imageDataVector.end());

或者尝试以下操作,注意如果从向量中删除多个项目,它将导致大量移动。

for (int j=imageDataVector.size()-1 ;j>=0;j--)
{
    if(imageDataVector[i] < threshold)
        imageDataVector.erase(imageDataVector.begin()+j);
}

答案 2 :(得分:3)

您试图将j倒数到零,imageDataVector.end() - 0不是有效的迭代器。在标准C ++库容器中,结束迭代器指向一个经过最后一个元素,而不是最后一个元素。