You usually used erase-remove idiom to efficiently remove several elements from a vector (erasing them one by one is usually less effective and, as you saw, are not always trivial). In its most general form, the idiom is as follows:
data.erase(remove_algorithm(begin(data), end(data)), end(data));
remove_algorithm , :
data.erase(
remove_indices(begin(data), end(data), begin(to_erase), end(to_erase)),
end(data));
, . 1:
template <typename It, typename It2>
auto remove_indices(It begin, It end, It2 idx_b, It2 idx_e) -> It {
using idx_t = typename std::iterator_traits<It2>::value_type;
std::sort(idx_b, idx_e, std::greater<idx_t>{});
for (; idx_b != idx_e; ++idx_b) {
auto pos = begin + *idx_b;
std::move(std::next(pos), end--, pos);
}
return end;
}
, . . ( ) ( ) . ( , ).
Live code
1 * Ahem * .