将排序范围插入关联容器的复杂性

Complexity of inserting sorted range into associative container

本文关键字:复杂性 关联 排序 范围 插入      更新时间:2023-10-16

该标准规定(23.4.4.2:5等),如果范围已经排序,则从范围[first, last)构造所有四个有序关联容器(mapmultimapsetmultiset

)应N = last - first线性。

然而,为了将范围(例如相同类型的容器)合并到现有容器中,23.2.4:8表102仅规定insert[i, j)的范围合并到容器中应具有复杂性N log(a.size() + N) N = distance(i, j)。 这似乎表明使用提示插入:

for (auto it = a.begin(); i != j; ++i)
    it = next(a.insert(it, *i));

可能比a.insert(i, j)更有效,复杂度严格小于N log(a.size() + N),这取决于正确的提示的比例(除了在琐碎的情况下N == 0);并且是线性的,因为每个提示都是正确的,如果a最初是空的。

这是标准的缺陷,还是有其他语言(或工具)涵盖这种情况? 在实践中,实现是否针对将有序关联容器合并到另一个容器进行了优化?

感谢 https://stackoverflow.com/a/11362162/567292 启发了这个问题。

在后一种情况下,我假设标准仅指定关联容器合并的最坏情况保证运行时性能,如果可能的话,则由实现来寻找更快的性能快捷方式。 请记住,与其他语言不同,C++规范正是规范。 没有"参考"实现。 因此,可以编写仅满足某些性能标准的实现,也可以决定实现超出指定性能标准的功能。 最后,尽管该规范旨在以某些算法的实现方式为您提供"最低"的性能保证。

话虽如此,如果您始终对每个元素使用提示,那么您最坏情况的性能实际上最终会比您简单地插入而不提示慢两倍。 因此,总是使用暗示不一定是灵丹妙药。