编辑:std::remove自撰写此答案以来,文档已修复。同样的事情也适用于list::remove。
让我举一个例子,向您展示cpluscplus.com如何将其弄错。
考虑std::remove来自的功能<algorithm>。
事实是std::remove不会从容器中删除项目。这是因为它std::remove仅与一对迭代器一起使用,并且对实际上包含项目的容器一无所知。实际上,不可能std::remove知道基础容器,因为不可能从一对迭代器去发现迭代器所属的容器。因此std::remove,不要仅仅因为无法删除项目就不会删除它们。实际从容器中删除项目的唯一方法是在该容器上调用成员函数。
因此,如果要删除项目,请使用Erase-Remove Idiom:
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
但是cplusplus.com给出有关的错误信息std::remove。它说
请注意,此函数不会更改超出新端的元素,这些元素保留其旧值并且仍可访问。
这是不正确的。范围中的迭代器[new_end, old_end)仍然是可取消引用的,但这并不意味着它们保留旧值并且仍可访问。未指定。
同样,cplusplus.com给出的信息也不正确list::remove。它说,
请注意,存在一个全局算法函数remove,其行为类似,但在两个迭代器之间运行。
这是完全错误的。全局删除即std::remove是不相似的list::remove,正如我们所看到的是,前者并没有真正删除从容器中的项目,因为它不能,而后者(成员函数)确实删除的项目,因为它可以。
该答案是从我在以下主题中的另一个答案中复制而来的,仅作了少许修改:
注意:因为我最近在回答上述主题时遇到了这个问题,所以我记得它。在过去的两年中,我遇到了很多错误,我不记得了。如果再次遇到,我可能会再添加一些。