You either corrupted your vector somewhere, or you tried to access outside of its bounds.
When I close the game I get assertion failure "vector subscript out of range". What did I do wrong?
Both of those statements are inaccurate.
I still get the vector assertion failure even when I changed the std::vector to std::list
I also found out that I can use the std::vector even I don't #include <vector>
If you change it to a list then you wont get assert about the vector because it isn't a vector any more. A std::list does not use code from within the std::vector. You're probably just getting the same error from a different piece of the std library. Getting the same behviour probably means that you are going past the end of the container rather than corrupting it.
If code with vector still compiles, then something else you are including is pulling in the vector header for you. You should probably not be relying on that.
If you need your vector to hold pointers for reasons of polymorphism, then you might be better off with a boost ptr_container rather than a vector. Otherwise you should problably just store instances directly rather than pointers.