to avoid moving the same elements many times, we can move them by ranges between deleted indexes
// fill vMyIndexes, take care about duplicated values vMyIndexes.push_back(-1); // to handle range from 0 to the first index to remove vMyIndexes.push_back(vMyValues.size()); // to handle range from the last index to remove and to the end of values std::sort(vMyIndexes.begin(), vMyIndexes.end()); std::vector<int>::iterator last = vMyValues.begin(); for (size_t i = 1; i != vMyIndexes.size(); ++i) { size_t range_begin = vMyIndexes[i - 1] + 1; size_t range_end = vMyIndexes[i]; std::copy(vMyValues.begin() + range_begin, vMyValues.begin() + range_end, last); last += range_end - range_begin; } vMyValues.erase(last, vMyValues.end()); P.S. fixed a bug, thanks to Steve JessopSteve Jessop that patiently tried to show me it