我有由几个元素组成的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如果向量中只剩下一个元素,就会出现这个错误。我做错了什么?
发布于 2011-03-08 05:06:42
if(imageDataVector[i] < threshold)
imageDataVector.erase(imageDataVector.end()-j);应该是:
if(imageDataVector[j] < threshold)
imageDataVector.erase(imageDataVector.begin()+j);编辑:为了完整性,使用了erase-remove方式和迭代器方式:
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;
}发布于 2011-03-08 05:07:24
你混合了前向和后向索引。
我会考虑改用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);
}发布于 2011-03-08 05:09:04
您正在尝试将j倒数到零,而imageDataVector.end() - 0不是有效的迭代器。在标准的C++库容器中,结束迭代器指向最后一个元素,而不是最后一个元素。
https://stackoverflow.com/questions/5225229
复制相似问题