In general, I find that it's a good idea to add a flag (normally I call this "dead") to the objects.
Then you can do this (in pseudo-pythonic code):
// Processing
for obj in my_list:
if obj has hit enemy:
obj.dead = true
if obj outside play area:
obj.dead = true
// Rendering (at some different point)
for obj in my_list:
render somehow
Then you can use the std::remove_if higher-order function (in algorithms) to remove the ones with the "dead" flag set. Remember to use std::erase to truncate the vector to the right point.
The main advantage of using this remove_if/erase is that it avoids problems when trying to remove elements while iterating the list.
Additionally, sometimes you may want to remove object X while processing object Y (in collision detection, such situations are normal) - we can do this easily without breaking any iterator objects.
(Note that iterator objects are normally only valid as long as no new elements are added or removed. Especially for std::vector)