The copy constructor and the copy-assignment operator need to copy the underlying vector to a new vector rather than copy the shared pointer.
The pointer we use is smart pointer, and the memory of the vector is handled by the smart pointer, so that we don't need use destructor to release the memory by ourself.