Examples
Example 1: vector::insert.
Let's say you want to add n elements into a vector v . Calling v.insert(position,x) repeatedly can cause multiple reallocations as v grows its storage to accommodate each new element. Worse, each single-element insert is a linear operation because it has to shuffle over enough elements to make room, and this makes inserting n elements with repeated calls to the single-element insert actually a quadratic operation! Of course, you could get around the multiple-reallocation problem by calling reserve , but that doesn't reduce the shuffling and the quadratic nature of the operation. It's faster and simpler to just say what you're doing: v.insert(position,first,last) , where first and last are iterators delimiting the range of elements to be added into v . (If first and last are input iterators, there's no way to determine the size of the range before actually traversing it, and therefore v might still need to perform multiple reallocations; but the range version is still likely to perform better than inserting elements individually.)Example 2: Range construction and assignment.
Calling a constructor (or assign function) that takes an iterator range typically performs better than calling the default constructor (or clear ) followed by individual insertions into the container.