我有几个元素组成的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
如果向量中只剩下一个元素,则会发生此错误。我做错了什么?
答案 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 ++库容器中,结束迭代器指向一个经过最后一个元素,而不是最后一个元素。