您的删除代码不正确。删除擦除成语看起来像这样:
vector<int>::iterator it = remove(v.begin(), v.end(), 5);
v.erase(it, v.end());
在这种情况下,它具有擦除等于5的所有值的效果,但是它最小化拷贝以实现所需的量。
您的查找 - 删除代码只会删除第一个等于5的值,因此它会按照您的要求进行操作。
删除代码将所有不等于5的值移动到向量的前面(这就是std::remove
的作用),擦除向量的剩余元素之一,并在其后留下任何其余元素,其中包含未指定的值(这也是remove
所做的)。如果矢量首先不包含5
,则它具有未定义的行为,因为在这种情况下,remove
将返回v.end()
。
因此,如果您只想擦除几个等于5的单个元素,那么std::remove
对您没有用处,因为它不保留(其他)5。如果你想在非5值开始和5个值移动到结束,去除第一的5S之前,那么你实际上可以做到这一点与std::partition
只是不能与std::remove
:
auto it = partition(v.begin(), v.end(), [](int i) { return i != 5; });
if (it != v.end()) v.erase(it);
虽然,因为一个5作为另一个您删除了最后的5秒,而不是第一个获得相同的结果,而且它的效率更高,当有超过其中一个是好的:
auto it = partition(v.begin(), v.end(), [](int i) { return i != 5; });
if (it != v.end()) v.pop_back();
如果你能以某种方式确保矢量最初包含正好一个元素等于5(没有更多或更少s),那么你的两个代码就会做同样的事情。在这种情况下,您不需要在查找 - 清除代码中对it != v.end()
进行测试,您会知道它不相同。你可以做v.erase(find(v.begin(), v.end(), 5))
。
[我在这里做了两个评论,但他们都错了,请忽略:-)] –
更好的答案在这里提供:https://stackoverflow.com/questions/24011627/erasing-using-iterator-from-查找或删除 – giuseppe