¿Qué es más rápido hacer, 100 borrados en std:: vector (en un tamaño de 1000) o para hacer un nuevo vector e insertar los elementos deseados en él?

Para responder a esta pregunta, primero se debe entender cómo se implementa std :: vector. En palabras simples, vector es una matriz redimensionable que implica que los elementos se almacenan contiguamente en la memoria. Entonces, cuando uno realiza y borra en el vector, digamos que el primer elemento se borra, todos los elementos anteriores se moverán una vez a la ubicación de la memoria izquierda.

En su caso de prueba, podría haber 3 escenarios:

  1. Se eliminan 100 elementos contiguos de cualquier lugar que no sea el final:
    Los otros elementos se moverán a la izquierda una vez. es decir, 900 movimientos + 100 destrucción
  2. Se eliminan 100 elementos aleatorios:
    Los elementos se moverán 100 veces. es decir, 100 * 900 movimientos (simplificado) +100 destrucción
  3. 100 elementos contiguos se eliminan del final: Sin movimientos + 100 destrucción.

Crear un nuevo vector y empujar elementos hacia él será lineal, es decir, 900 instrucciones.

pero entonces la pregunta es ¿qué harás con el viejo vector? un std :: vector clear significaría 1000 destrucción / disminución del recuento de ref.

Hay muchas otras variables a tener en cuenta, ¿cuál es el tipo de datos de los POD vectoriales? Se destruyen trivialmente, por lo que la complejidad del tiempo es constante. En general, hay otras cosas a tener en cuenta al insertar elementos, std :: move sería mucho más rápido y seguro para mover elementos.

No tengo idea. ¿Cuánto tiempo tomaría escribir un pequeño programa de prueba que lo haga, digamos, un millón de veces y obtenga una respuesta precisa para su compilador y biblioteca?