编辑: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
,正如我们所看到的是,前者并没有真正删除从容器中的项目,因为它不能,而后者(成员函数)确实删除的项目,因为它可以。
该答案是从我在以下主题中的另一个答案中复制而来的,仅作了少许修改:
注意:因为我最近在回答上述主题时遇到了这个问题,所以我记得它。在过去的两年中,我遇到了很多错误,我不记得了。如果再次遇到,我可能会再添加一些。