该标准规定(23.4.4.2:5 等)如果范围已经排序,则从范围构造所有四个有序关联容器( map
、multimap
、set
、multiset
)[first, last)
应是线性的。N = last - first
然而,为了将范围(例如,相同类型的容器)合并到现有容器中,23.2.4:8 表 102 仅指定insert
将范围[i, j)
合并到容器中应具有复杂性N log(a.size() + N)
where 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
最初是空的。
这是标准的缺陷,还是有其他语言(或设施)涵盖这种情况?在实践中,实现是否优化了将有序关联容器合并到另一个容器中?