¿En qué escenario utilizo un contenedor STL en particular?
He estado leyendo sobre contenedores STL en mi libro sobre C++, específicamente la sección sobre STL y sus contenedores. Ahora entiendo que todos y cada uno de ellos tienen sus propias propiedades específicas, y estoy cerca de memorizarlas todas... Pero lo que aún no entiendo es en qué escenario se usa cada una de ellas.
¿Cuál es la explicación? Se prefiere mucho el código de ejemplo.
Esta hoja de trucos proporciona un resumen bastante bueno de los diferentes contenedores.
Consulte el diagrama de flujo en la parte inferior como guía para utilizar en diferentes escenarios de uso:
Creado por David Moore y con licencia CC BY-SA 3.0
Aquí hay un diagrama de flujo inspirado en la versión de David Moore (ver arriba) que creé, que está actualizada (en su mayor parte) con el nuevo estándar (C++11). Esta es sólo mi opinión personal, no es indiscutible, pero pensé que podría ser valioso para esta discusión:
Respuesta simple: úselo std::vector
para todo a menos que tenga una razón real para hacerlo de otra manera.
Cuando encuentre un caso en el que esté pensando: "Vaya, std::vector
aquí no funciona bien debido a X", opte por la base de X.
Mire STL efectivo de Scott Meyers. Es bueno para explicar cómo usar STL.
Si desea almacenar una cantidad determinada/indeterminada de objetos y nunca va a eliminar ninguno, entonces lo que desea es un vector. Es el reemplazo predeterminado para una matriz C y funciona como tal, pero no se desborda. También puedes establecer su tamaño de antemano con reserve().
Si desea almacenar una cantidad indeterminada de objetos, pero los agregará y eliminará, entonces probablemente desee una lista... porque puede eliminar un elemento sin mover los elementos siguientes, a diferencia del vector. Sin embargo, requiere más memoria que un vector y no se puede acceder secuencialmente a un elemento.
Si desea tomar un montón de elementos y encontrar solo los valores únicos de esos elementos, leerlos todos en un conjunto será suficiente y también los ordenará por usted.
Si tiene muchos pares clave-valor y desea ordenarlos por clave, entonces un mapa es útil... pero solo contendrá un valor por clave. Si necesita más de un valor por clave, puede tener un vector/lista como valor en el mapa o usar un mapa múltiple.
No está en el STL, pero sí en la actualización TR1 del STL: si tiene muchos pares clave-valor que va a buscar por clave y no le importa su orden, puede Quiero usar un hash, que es tr1::unordered_map. Lo he usado con Visual C++ 7.1, donde se llamaba stdext::hash_map. Tiene una búsqueda de O(1) en lugar de una búsqueda de O(log n) para el mapa.