And I definitely like Mac programming a lot more than Windows. We'll see whether I think the same way once I progress a bit more, but I'm enjoying it a lot
I straddle both platforms myself, and I have to say, Cocoa and C# .NET are the only two desktop languages I use anymore. MFC, Win32, InterfaceLib? I don't want to see those abominations anymore. To be fair though, Carbon is a
huge improvement over the legacy that was InterfaceLib, and I don't want to see that go just yet.
As for the "Can I do STL-like constructs?" question from the OP... you don't need em.
Obj-C is a dynamically-typed language. You don't
need to have a templated version of NSArray, because NSArray can store anything subclassed from NSObject in it (and every class you write should be subclassed from NSObject for core functionality like getting an object's type, checking for methods, memory management, etc).
You don't need multiple inheritance (which is really ugly to begin with, IMO), as you have protocols/interfaces to play with. C# also ditched multiple inheritance (thank god).
Every method in Obj-C is 'virtual' (in the C++ sense), so you can always override a parent class when needed, and can always call back up to the parent class' behavior when needed (and decide
where in your code to do it, which is a huge deal, IMO).
You can dynamically check if an object (pointed to by an id or NSObject*) has a method on it or not, so you can do informal protocols/interfaces as well (or have protocols/interfaces with optional methods).
Put simply, the other guy is right... don't try to make Obj-C work like C++. It doesn't need to. You approach problems in a different way in Obj-C, but that isn't always a bad thing. The sheer flexibility of the language can be intoxicating.