me estoy ofreciendo varios métodos:
1. Un método rápido que no retenga el orden original de los elementos:
Asigna el último elemento actual del vector al elemento para borrar, luego borra el último elemento. Esto evitará movimientos grandes y todos los índices excepto el último permanecerán constantes. Si comienza a borrar desde la parte posterior, todos los índices precalculados serán correctos.
void quickDelete(int idx)
{
vec[idx] = vec.back();
vec.pop_back();
}
Veo esto es esencialmente una versión codificada a mano del idioma de borrado-remove señalado por Klaim ...
2. Un método más lento que conserva el orden original de los elementos:
Paso 1: Marque todos los elementos vectoriales a eliminar, es decir, con un valor especial. Esto tiene O (| índices para eliminar |).
Paso 2: borre todos los elementos marcados usando v.erase(remove (v.begin(), v.end(), special_value), v.end());
. Esto tiene O (| vector v |).
El tiempo total de ejecución es, por lo tanto, O (| vector v |), suponiendo que la lista de índices es más corta que el vector.
3. Otro método más lento que conserva el orden original de los elementos:
Uso un predicado y eliminar si como se describe en https://stackoverflow.com/a/3487742/280314. Para hacer esto eficiente y respetando el requisito de no "ordenando luego borrando linealmente con un desplazamiento", mi idea es implementar el predicado usando una tabla hash y ajustar los índices almacenados en la tabla hash a medida que la eliminación continúa al volver verdadero, como Klaim sugirió.
"ordenar y luego borrar linealmente con un desplazamiento no es una opción": ¿Por qué? – Niki