標準では、範囲が既にソートされている場合、範囲から 4 つの順序付けられた連想コンテナー ( map
、multimap
、set
、multiset
) をすべて[first, last)
線形に構築することが規定されています (23.4.4.2:5 など)。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
)。が最初は空の場合、すべてのヒントが正しいため、linearです。a
これは標準の欠陥ですか、それともこのケースをカバーする他の言語 (または機能) がありますか? 実際には、実装は順序付き連想コンテナを別のコンテナにマージするために最適化されていますか?
この質問に刺激を与えてくれたhttps://stackoverflow.com/a/11362162/567292の功績。