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

问题描述 投票:5回答:3

我有由几个元素组成的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

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

c++ stl vector iterator
3个回答
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;
}

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

3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.