I've got an object definition (let's call it obj.cc and obj.h). In obj.h is the class declaration, and for instance, it uses both the "<iostream>" and the "<list>" libraries (one of the member variables is a list of pointers to another class).
Now, let's say I need to use said class in "main.cc". So I include obj.h... but it complains because it doesn't recognize the type "list<>". Even though the list is in the private members and never actually used by main.cc directly. So I have to include "<list>" in every c++ file if it includes said header.
If you have an object declaration in a header, how did you even manage to get an unrecognized type? I mean, to declare a list type member in a class, you would need to include the list class from standard library in the object definition header.
As for your library question, well, some people actually do something like this, they have one header, in which they include all STD classes and libraries, then just include this header in all files. Your compiler should be smart enough to only have to compile this header once, as this should never really change.
Also, good practice comes with actually working with the language. It does not really make sense to try and force yourself to write perfect code from the get go, that way you will spend way to much time writing good code, and to little time actually making something useful.
Good practice is usually defined by structuring your program appropriately. This means that you start out with a lot of primitive data types, say iterators, smart pointers and whatever. The important part is that these primitives often do not have any dependencies. Then you slowly add more complex objects from these primitives, like queues, lists and vectors etc. (A lot of these primitives are already in the STD library, so writing them yourself for anything other than practice is redundant.)
Also, good design usually also means as few dependencies as possible, keep your code modular and objective. While trying to avoid pitfalls like singletons and other annoying dependency chains.
But always remember, do not focus on writing perfect code at first, try at first just to get things done, get familiar with the language and OO-programming.