首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能删除向量的最后一个元素

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

Stack Overflow用户
提问于 2011-03-08 05:05:02
回答 3查看 12.4K关注 0票数 5

我有由几个元素组成的stl向量。我需要遍历这个向量并删除满足某些条件的元素。所以我写了这段代码

代码语言:javascript
运行
复制
for (int j = imageDataVector.size()-1; j >= 0; j--) {
    if(imageDataVector[i] < threshold)
        imageDataVector.erase(imageDataVector.end() - j);
}

这段代码几乎适用于所有情况,但是如果向量的所有元素都满足条件,我会得到一个错误:

代码语言:javascript
运行
复制
vector erase iterator outside the range

如果向量中只剩下一个元素,就会出现这个错误。我做错了什么?

EN

回答 3

Stack Overflow用户

发布于 2011-03-08 05:06:42

代码语言:javascript
运行
复制
if(imageDataVector[i] < threshold)
        imageDataVector.erase(imageDataVector.end()-j);

应该是:

代码语言:javascript
运行
复制
if(imageDataVector[j] < threshold)
        imageDataVector.erase(imageDataVector.begin()+j);

编辑:为了完整性,使用了erase-remove方式和迭代器方式:

代码语言:javascript
运行
复制
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;
}
票数 11
EN

Stack Overflow用户

发布于 2011-03-08 05:07:24

你混合了前向和后向索引。

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

它看起来像这样:

代码语言:javascript
运行
复制
imageDataVector.erase(std::remove_if(imageDataVector.begin(), imageDataVector.end(), std::bind2nd(std::less<data_type>(), threshold)), imageDataVector.end());

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

代码语言:javascript
运行
复制
for (int j=imageDataVector.size()-1 ;j>=0;j--)
{
    if(imageDataVector[i] < threshold)
        imageDataVector.erase(imageDataVector.begin()+j);
}
票数 6
EN

Stack Overflow用户

发布于 2011-03-08 05:09:04

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5225229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档