我假设你问的是一个假设的定义stable_remove
成为什么remove
目前是,并且remove
然而,实施者认为最好以任何顺序给出正确的值。期望实施者能够在做与以下完全相同的事情的基础上进行改进stable_remove
.
实际上,图书馆不能easily做这个优化。这取决于数据,但您不想在决定如何删除每个元素之前花费太长时间来计算将删除多少个元素。例如,您可以进行一次额外的传递来对它们进行计数,但在很多情况下,额外的传递效率很低。仅仅因为在某些情况下不稳定的删除比稳定的删除速度更快,并不一定意味着在两者之间进行选择的自适应算法是一个不错的选择。
我认为之间的区别remove
and sort
排序是known这是一个复杂的问题,有很多不同的解决方案、权衡和调整。所有“简单”排序算法都很慢一般。大多数标准算法都非常简单,并且remove
是其中之一但是sort
不是。我认为定义它没有多大意义stable_remove
and remove
作为单独的标准功能。
编辑:您使用我的调整进行的编辑(类似于std::partition
但不需要将值保留在右侧)对我来说似乎相当合理。它需要一个双向迭代器,但标准中已有在不同迭代器类别上表现不同的算法的先例,例如std::distance
。因此标准可以定义unstable_remove
只有requires一个前向迭代器,但如果它得到一个 bidi 迭代器,你就可以做你的事情了。该标准可能不会列出算法,但它可能有这样的短语“如果迭代器是双向的,则最多min(k, n-k)
移动到哪里k
是删除的元素数量”,这实际上会强制它。但请注意,该标准目前并未说明移动次数remove_if
确实如此,所以我认为确定这一点根本不是一个优先事项。
当然,没有什么可以阻止您实现自己的unstable_remove
.
如果我们接受标准不需要指定不稳定的删除,那么问题就归结为是否应该调用它定义的函数stable_remove
, 展望未来remove
对于双向迭代器来说,它的行为有所不同,并且如果用于执行不稳定删除的一些聪明的启发式方法变得足够众所周知,值得作为标准函数,那么对于前向迭代器来说,它的行为也可能有所不同。我想说不是:如果标准函数的名称不完全规则,那并不是一场灾难。从 STL 中删除稳定性保证可能会造成相当大的破坏remove_if
。那么问题就变成了,“为什么 STL 不把它称为stable_remove_if
”,对此我只能回答,除了所有答案中提出的所有观点之外,STL设计过程比标准化过程要快得多。
stable_remove
还会打开一个关于其他标准功能的蠕虫罐头,这些功能可能理论上有不稳定的版本。对于一个特别愚蠢的例子应该copy
叫做stable_copy
,以防万一存在某种实现,在复制时反转元素的顺序明显更快?应该copy
叫做copy_forward
,以便实现可以选择哪一个copy_backward
and copy_forward
被称为copy
根据哪个更快?委员会的部分工作就是在某处划定界限。
我认为实际上当前的标准是明智的,单独定义一个stable_remove
and a remove_with_some_other_constraints
, but remove_in_some_unspecified_way
只是没有提供同样的优化机会sort_in_some_unspecified_way
做。 Introsort 是在 1997 年发明的,当时 C++ 正在标准化,但我不认为周围的研究工作remove
与过去和周围的情况完全一样sort
。我可能错了,正在优化remove
可能是下一件大事,如果是这样,那么委员会就错过了一个机会。