I don't think any compiler would replace index notation with iterator constructs. It's not really an optimisation (especially if the iterator coding isn't quite as optimal as possible).
The point of using iterator notation rather than index notation is that iterator notation is pointer notation, which can be used with ANY container that is standard in C++, not just STL ones. That means that the same (templated, generic) code will work with raw arrays in the same way as it will work for vectors, or maps or deques or whatever.
However, if you want a good way to do what you are suggesting, I would suggest using boost and doing:
BOOST_FOREACH(Sprite s, vSprites)
{
s.Draw();
}
as then you don't need to worry about messing around with iterators, indices or anything else
There is an STL version of for_each but it isn't as useful as the boost version, although I think there may be an improved version in C++0x.