编辑: 自从本回答撰写之后,std::remove
的文档已经修复。对于list::remove
也适用。
让我通过一个示例来说明cpluscplus.com可能会出错的情况。
考虑来自<algorithm>
的std::remove
函数。
事实是,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
,具有类似的行为,但在两个迭代器之间操作。
这是完全错误的。全局的remove
即std::remove
与list::remove
不同,因为前者实际上并没有从容器中删除项,因为它不能,而后者(成员函数)确实删除了项,因为它可以。
这个回答是从我在以下话题中的另一个答案中复制来的,稍微修改一下:
注意:由于我最近在回复上述话题时遇到了这个问题,我记得它。在过去的两年中,我遇到了许多错误,我不记得了。如果我再次遇到,我可能会添加几个。