When passing class instance as argument to a function, the whole class instance will be copied before being passed around
That's only true if you're passing by value. If you're passing by reference, then you are in fact passing only a pointer, so there is no difference in efficiency.
In the few cases where you can't pass by reference and must pass by value such as pushing onto a vector, the compiler generates a very efficient move of the object onto the stack. When referencing an object in an STL container, an iterator is a pointer, so there is no difference in efficiency there.
In my experience when using STL containers, the benefits of adding a object to a container by value far outweigh any percieved efficiency of pushing only a pointer.
There are too many opportunities for the pointer and what it points to get out of sync. If you're going to be using pointers with an STL container, you need to be using a unique_ptr.
Passing by reference can generally be more efficient than passing a pointer because it is easier for the compiler to inline the function with the reference than with the pointer. This is what makes std::function callbacks more efficient than function pointer callbacks in many benchmarks - the compiler can more easily inline everything.