J'offre plusieurs méthodes:
1. Une méthode rapide qui ne retient pas l'ordre initial des éléments:
Affectez le dernier élément actuel du vecteur à l'élément à effacer, puis effacez le dernier élément. Cela évitera les gros mouvements et tous les index sauf le dernier resteront constants. Si vous commencez à effacer à l'arrière, tous les index précalculés seront corrects.
void quickDelete(int idx)
{
vec[idx] = vec.back();
vec.pop_back();
}
Je vois essentiellement une version est codée à la main de l'idiome d'effacement remove a par Klaim ...
2. Une méthode plus lente qui conserve l'ordre initial des éléments: Etape 1: Marquez tous les éléments vectoriels à supprimer, c'est-à-dire avec une valeur spéciale. Cela a O (| indexes pour supprimer |).
Étape 2: Effacer tous les éléments marqués en utilisant v.erase(remove (v.begin(), v.end(), special_value), v.end());
. Cela a O (| vecteur v |).
La durée totale d'exécution est donc O (| vector v |), en supposant que la liste d'index est plus courte que le vecteur.
3. Une autre méthode plus lente qui maintient l'ordre initial des éléments:
Utilisation d'un prédicat et enlever si comme décrit dans https://stackoverflow.com/a/3487742/280314. Pour rendre cela efficace et respecter l'exigence de de ne pas "trier puis effacer linéairement avec un décalage", mon idée est d'implémenter le prédicat en utilisant une table de hachage et d'ajuster les index stockés dans la table de hachage Klaim a suggéré.
"trier puis effacer linéairement avec décalage n'est pas une option": pourquoi? – Niki