9¿Cómo gestiona std::vector la capacidad, el crecimiento, la realocación y la estabilidad de iteradores?
std::vector almacena elementos de forma contigua y lleva tanto size como capacity. size es el número de elementos construidos; capacity es la cantidad de almacenamiento de elementos asignado disponible antes de que se necesite otra asignación. Cuando añadir elementos excedería la capacity, vector asigna un bloque más grande, típicamente usando una estrategia de crecimiento geométrico definida por la implementación, mueve o copia los elementos existentes, destruye los antiguos y libera el almacenamiento antiguo. reserve(n) aumenta la capacity sin cambiar size, mientras que resize(n) cambia size construyendo o destruyendo elementos. La realocación invalida todos los iteradores, referencias y punteros a elementos; incluso sin realocación, operaciones como insert y erase pueden invalidar posiciones en o después del punto de modificación.
Probar responder esta pregunta con un coach de IA
10¿Qué reglas de invalidación deberías conocer para contenedores estándar contiguos y basados en nodos?
Las reglas de invalidación dependen del contenedor y de la operación. Los contenedores contiguos como vector y string tienen una estabilidad frágil de iteradores/referencias: el crecimiento puede realocar e invalidar todos los iteradores, referencias y punteros, e insert/erase pueden desplazar elementos e invalidar posiciones en o después del cambio incluso sin realocación. Los contenedores ordenados basados en nodos como list, map, set y sus variantes multi generalmente mantienen estables los iteradores y referencias a elementos existentes no borrados durante insert; borrar un elemento invalida el iterador/referencia a ese elemento borrado. Los contenedores unordered también almacenan elementos en nodos, por lo que las referencias y punteros a elementos generalmente permanecen estables durante rehash, pero rehash invalida iteradores. deque tiene reglas especiales de almacenamiento segmentado. En la práctica, revisa el contenedor y la operación específicos antes de guardar iteradores o referencias a través de modificaciones.
Probar responder esta pregunta con un coach de IA
11Compara std::map, std::unordered_map y contenedores de estilo flat-map para tablas de búsqueda en backend.
std::map es un contenedor asociativo ordenado, normalmente basado en árbol, con búsqueda/inserción/borrado logarítmicos; es útil cuando importan la iteración ordenada, las consultas por rango o las garantías de orden. std::unordered_map está basado en una tabla hash, con operaciones por clave exacta de tiempo constante en promedio y sin ordenación de claves; a menudo es una buena opción por defecto para tablas de búsqueda grandes y mutables cuando el hashing es bueno. Un contenedor de estilo flat-map almacena pares clave/valor ordenados de forma contigua, lo que proporciona buena localidad de caché e iteración/búsqueda binaria rápidas, pero la inserción y el borrado en medio son lineales. Para tablas de búsqueda en backend, elige según si la carga de trabajo necesita ordenación/rangos, principalmente búsquedas exactas, mutación frecuente, latencia predecible, sobrecarga de memoria y comportamiento de caché.
Probar responder esta pregunta con un coach de IA
12Explica std::optional y casos de uso típicos en backend para representar valores ausentes.
std::optional<T> representa o bien un valor T contenido o bien ningún valor. El estado vacío se representa con std::nullopt; el código puede comprobar has_value() o usar el optional en contexto booleano, acceder al valor con * o value(), y proporcionar un valor por defecto con value_or(). En código backend es útil para campos de base de datos anulables, campos opcionales de solicitud/configuración, fallos de caché o repositorio donde la ausencia es esperada, y estados de dominio donde un centinela como -1 o una cadena vacía sería ambiguo. Modela la ausencia de un valor, no polimorfismo ni información de error rica.
Probar responder esta pregunta con un coach de IA
13¿Qué son std::string_view y std::span, y qué peligros de vida introducen las vistas no propietarias?
std::string_view es una vista no propietaria de una secuencia contigua de caracteres; std::span<T> es una vista no propietaria de una secuencia contigua de T. Son útiles para parámetros de copia cero y APIs de buffers porque llevan un puntero y una longitud sin asignar ni poseer memoria. El principal peligro es la vida: el almacenamiento referenciado debe vivir más que la vista y no debe invalidarse mientras se usa la vista. Devolver o almacenar una vista a un temporal, objeto local, objeto destruido o contenedor realocado puede dejar una vista colgante.
Probar responder esta pregunta con un coach de IA