Вы обычно используете erase–remove idiom удалить несколько элементов из вектор эффективно (стирание их один за другим, как правило, менее эффективно, и, как вы видели, не всегда тривиально). В самом общем виде, идиома выглядит следующим образом:
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));
К сожалению , такой алгоритм не содержится в стандартной библиотеке.Тем не менее, это тривиально, чтобы написать :
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
* гм * После того, как вы удалили все глупые опечатки в вашем коде.
Возможно, вы можете заказать массив индексов и удалить элементы, начиная с последнего – Aleksej