Move semantics

Using std::move to reduce complexity from O(n) to O(1)

Move constructor

Move assignment

Re-use a moved object

Using move semantics on containers