You could also get similar functionality by having a vector of unique_ptrs.
You don't always want the vector to store pointers. It depends on what is being stored and how you use the vector.
If the vector stored pointers it would have to dynamically allocate the elements which could make things slower and less cache friendly. It also has some memory overhead. Sometimes you want the elements in the vector to be stored contiguous in memory.
A vector is designed to:
1. Minimize random access time.
2. Cheaply push and pop on the back.
If you need to pop from the front at all, then a vector just isn't the data structure to use there. std::deque sacrifices a tiny bit of random access performance in exchange for allowing cheaply popping and pushing on either end.