Aside: Sequence Containers
std::vector is one example of a sequence container
in C++.  There are 5 such containers that each offer different
performance attributes:
- std::array : fixed size contiguous storage. - Complexity: - random access: \(\mathcal{O}(1)\) 
- insertion: not supported 
 
- std::vector : automatically resizing array (as needed). - Complexity: - random access: \(\mathcal{O}(1)\) 
- insertion at end: amortized constant \(\mathcal{O}(1)\) 
- insertion / removal elsewhere: \(\mathcal{O}(N)\) (actually depends on distance to the end) 
 
- std::deque : a double-ended queue—this means that it is easy to add elements to either end. Data is not stored contiguously in memory. - Complexity: - random access: \(\mathcal{O}(1)\) 
- insertion / removal at beginning or end: \(\mathcal{O}(1)\) 
- insertion / removal elsewhere: \(\mathcal{O}(N)\) 
 
- std::list : this is a doubly-linked list. It is an easy operation to insert an element, but there is not random access to a particular element, instead you must walk through the list. - Complexity: - random access: not supported 
- insertion / removal anywhere: \(\mathcal{O}(1)\) 
 
- std::forward_list : this is a singly-linked list. You can only walk through in one direction. - Complexity: - random access: not supported 
- insertion / removal anywhere: \(\mathcal{O}(1)\)