If your compiler happily knows what a std::string is without #include <string> and then doesn't know how to apply the << operator to one, it's time to get a new compiler.
I am confused about why the addition is necessary to make the program work since I am using precisely the same set up:
Win 7 32bit
MSYS + MINGW
NetBeans
Having cut and paste the program from the first example it compiles and runs without a hitch.
My own guess is that you don't have the compilers set up properly. I'm quite happy to take a look at this if you'd like to take a look at how you're set up.
Meanwhile, I wouldn't be too fast to knock NetBeans. I know we all have our favourites but since using it I am reluctant to change. I have tried A LOT of IDEs.
Which other headers a given header includes is not defined by the standard. For example, a valid implementation could have an <iostream> that includes ALL the other headers. A user of such an implementation wouldn't need to include any other headers, but that doesn't make the code standard-compliant, as it assumes that the implementation follows a specific behavior.
In other words, if you want to use std::string and you want portability, you must include <string>. Simple as that.