IssMneur: ISO/IEC 14882:2003(E) specifies (page 489)
The elements of a vector are stored contiguously, meaning that if v is a vector<T, Allocator> where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
So I should have said any
conforming implementation
You might be surprised to learn that a vector supports amortised constant time inserts and erases at the end:
In addition, it supports (amortized) constant time insert and erase operations at the end; insert and erase in the middle take linear time.
(we'll come back to this for question 5)
I'm pretty sure IssMneur nailed it for question 1, except that a vector is 'normally' constant time (according to the standard).
2) By this I meant for regularly accessed data in a tight loop. Vector has significantly better data locality, so will perform significantly better than other data structures where a caching system is provided that is significantly faster than accesses into main memory.
3) No surprises - it's the list!
4) [quote IssMneur]
Non-const operations can modify the data structure which may move the data around in memory causing the pointers that the iterators have to point to the wrong thing location.[/quote]
5) This one you're both partially correct, but it's only a small overhead required for housekeeping.
Going back to question 1, the insert time for a vector is amortised constant.
This is achieved by OVERALLOCATING each time a reallocation and move is done.
So if you're pushing a 100 1KB objects onto a vector, you might be surprised to learn that the final vector size might be something like 150 elements (again, depends on the implementation).
Write yourself a little program comparing the return values from vector::capacity and vector::size and you'll see what I mean here.
I'm going to have to think to come up with something more challenging for you folks!