Yes, that is correct.
The most efficient solution is to permute the contents so that the things you want to remove are at the end, then use RemoveLast().
Note that the underlying storage is an array of *pointers*, so re-arranging pointers doesn't require copying whole message objects.