Есть ли разница между использованием .begin () и .end () для std :: insertter для std :: set? - PullRequest
33 голосов
/ 06 мая 2011

Если есть разница между it1 и it2?

std::set<sometype> s;

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

Ответы [ 2 ]

33 голосов
/ 06 мая 2011

На практике не сильно.Если вы вставляете большое количество уже упорядоченных элементов в пустой set, второй будет несколько быстрее, но это все.std::insert_iterator вызывает insert с итератором;std::set интерпретирует его как подсказку и вставляет в постоянное время (а не lg n), если вставка находится непосредственно перед подсказкой.(На самом деле, если set пусто, я думаю, что оба будут делать то же самое.)

7 голосов
/ 29 ноября 2012

С http://www.sgi.com/tech/stl/insert_iterator.html

В случае отсортированного ассоциативного контейнера, однако, итератор в конструкторе insert_iterator почти не имеет значения. Новые элементы не обязательно будут формировать непрерывный диапазон; они появятся в соответствующем месте контейнера, в порядке возрастания ключа. Порядок, в котором они вставляются, влияет только на эффективность: вставка уже отсортированного диапазона в отсортированный ассоциативный контейнер является операцией O (N).

...