I learned the complexity of deque::insert() from the C++ standard 2003 (chapter 23.2.1.3) as follows:
In the worst case, inserting a single element into a deque takes time linear in the minimum of the distance from the insertion point to the beginning of the deque and the distance from the insertion point to the end of the deque.
I always understand the implementation of stl deque as a collection of memory chunks. Hence an insertion will only affect the elements in the same memory chunk as the insertion position. My question is, what does the standard mean by “linear in the minimum of the distance from the insertion point to the beginning of the deque and the distance from the insertion point to the end of the deque”?
My understanding is because C++ standard does not enforce a certain implementation of deque. The complexity is just in general for the worst case. However, in the actual implementation in compilers, it is linear to the number of elements in a memory chunk, which may vary for different element sizes.
Another guess might be that, since insert() will invalidate all iterators, deque needs to update all iterators. Therefore it’s linear.
std::deque is normally (always?) implemented as a collection of chunks of memory, but it won’t normally insert a whole new chunk just for you to insert one new element in the middle of the collection. As such, it’ll find whether the insertion point is closer to the beginning or end, and shuffle the existing elements to make room for the new element in an existing chunk. It’ll only add a new chunk of memory at the beginning or end of the collection.