Vous emploieriez normalement erase–remove idiom supprimer plusieurs éléments d'un vector efficacement (les effacer un à un est généralement moins efficace et, comme vous l'avez vu, pas toujours trivial). Dans sa forme la plus générale, l'idiome ressemble à ceci:
data.erase(remove_algorithm(begin(data), end(data)), end(data));
Dans votre cas, le remove_algorithm
est basé sur les indices dans un autre vecteur, nous avons donc besoin de fournir ceux aussi bien:
data.erase(
remove_indices(begin(data), end(data), begin(to_erase), end(to_erase)),
end(data));
Malheureusement , un tel algorithme n'est pas contenu dans la bibliothèque standard.Cependant, il est trivial de vous écrire :
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;
}
Ici, nous trions les indices d'abord à retirer du plus grand au plus petit. Ensuite, nous bouclons sur ces indices. Nous déplaçons alors (de façon optimale) tous les éléments entre la position actuelle (à supprimer) et la fin du vecteur de un. Par la suite, la fin est diminuée de un (pour tenir compte du fait qu'un élément a été supprimé).
Live code
* Ahem * Une fois que vous avez supprimé toutes les fautes de frappe stupides dans votre code.
Peut-être que vous pouvez commander le tableau d'index et supprimer les éléments à partir de la dernière – Aleksej