Dear twinbaby,
I highly recommend that you go pick up the C programming books follow by the C++ programming books, then the STL follow by MFC. C++11 is better left alone until you get the basic of C++ right.
While it seems some C++ books do not assume newbies to have C knowledge, my recommendation is learn C first. C++ foundation are based on C. The Object Oriented portion of C++ are new to C. STL is the natural companion of C++ because the template nature of STL allows for generics to function. Without STL, C++ would have a hard time building the hierarchical inheritance model since in C++ there is no root class so to speak. With STL, generic containers are possible with strict typing, if not, you will be using a lot of "void type pointers", and "void type pointers" are not strict typing in nature. C++ compiler will not be able to perform type checking at static code analysis using compilation.
MFC is Microsoft Foundation Class. It is not comparable to STL. I believe there are a lot of 3rd party libraries out there built based on the foundation of STL, not MFC. MFC main objective is to provide much of Win32 API which previously are only exposed via the C interfaces. Containers in MFC are provided to facilitate the inner workings of MFC, but NOT as the generic containers and algorithms utility for C++.
Back to my earlier point, you are nitpicking on the knowledge and not learning the foundation of C/C++. This is going to just introduce more knowledge gaps and missing fundamentals for you to truly understand C/C++, less alone STL and MFC.
Learning C, C++, STL will not limit you to any platform. These are general knowledge no matter which platform you are on that support C and C++. MFC is only found in the Microsoft platform.
Please follow the right path to gain your knowledge, don't be confused among these terminologies. You are now like a headless housefly banging around.
Just to give you a nice comparison between Java and C++ and using STL
In Java
Code:
// without generics
List mylist = new ArrayList();
mylist.add(new Integer(11));
Integer i = (Integer)mylist.get(0);
//with generics
List<Integer> mylist = new ArrayList<Integer>();
mylist.add(new Integer(11));
Integer i = mylist.get(0);
In C++
Code:
list<int> *mylist = new list<int>();
mylist->push_front(11);
int i = mylist->front();
In Java, you have the root Object class and interface, because of this well defined hierarchy, even in Java, you can have generic container that operate using Object as the items in the container before generics. The runtime reflection of Java helps a lot to allow real implementation methods to be invoked inside the container even if the actual type of the object is unknown. Such as if my list contains ["Hello", Integer(1), Float(1.3)], calling toString method of Java will print out "Hello", 1 and 1.3 respectively.
In C++, this is not possible because the inheritance model of C++ is not as well defined as Java. Without STL, your generic container will be (void*), it means a memory address pointer that point to somewhere at address XYZ. Nothing is known about the object placed there, you can't even query if it's an integer there or an object.
With STL, it will be similar to the later established Generics of Java. Even that, Generics in Java are a lot more powerful because of type inference and type checking, but Generics makes programming in Java more complicated especially where Generics are not covariant.
In C++, you have to explicitly specify the types of a container. It is unlike Java limited to objects only. As a template engine, it allows for any types as long as the type rules comply. C++ template engine is very powerful too. I have come across that it can be used solely to implement type inference to the extent beyond my comprehension.
I hope these shed some lights into how complicated things can be, so please build up your foundation, don't waste time hitting around aimlessly.