¿En qué escenario utilizo un contenedor STL en particular?

Resuelto Daniel Sloof asked hace 15 años • 10 respuestas

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.

Daniel Sloof avatar Jan 23 '09 07:01 Daniel Sloof
Aceptado

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:

http://linuxsoftware.co.nz/containerchoice.png

Creado por David Moore y con licencia CC BY-SA 3.0

zdan avatar Jan 23 '2009 00:01 zdan

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:

ingrese la descripción de la imagen aquí

Mikael Persson avatar Mar 26 '2014 19:03 Mikael Persson

Respuesta simple: úselo std::vectorpara 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::vectoraquí no funciona bien debido a X", opte por la base de X.

David Thornley avatar Jan 23 '2009 16:01 David Thornley

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.

Mark Krenitsky avatar Jan 23 '2009 01:01 Mark Krenitsky