web-dev-qa-db-ja.com

std :: setのstd :: inserterに.begin()と.end()を使用することに違いはありますか?

It1とit2の間に違いがある場合は?

std::set<sometype> s;

auto it1 = std::inserter(s, s.begin());
auto it2 = std::inserter(s, s.end());
33
Loom

実際には、それほど多くはありません。空のsetに、すでに順番に並んでいる要素を多数挿入する場合、2番目の要素はやや高速になりますが、それだけです。 std::insert_iteratorイテレータでinsertを呼び出します。 std::setはそれをヒントとして解釈し、挿入がヒントの直前にある場合は(lg nではなく)一定時間で挿入します。 (実際、setが空の場合、どちらもまったく同じことを行うと思います。)

33
James Kanze

から http://www.sgi.com/tech/stl/insert_iterator.html

ただし、Sorted Associative Containerの場合、insert_iteratorのコンストラクターのイテレーターはほとんど関係ありません。新しい要素は必ずしも連続した範囲を形成するわけではありません。キーの昇順で、コンテナ内の適切な場所に表示されます。それらが挿入される順序は効率にのみ影響します。すでにソートされた範囲をソート済み連想コンテナーに挿入することは、O(N)操作です。

7
zrb