funciona - stl c++ español
ventajas de std:: set vs vectores o mapas (5)
Esta puede ser una pregunta estúpida, soy bastante nuevo en C ++ y en la programación en general. Deseo entender el uso de varios contenedores STL y con esto en mente, me preguntaba cuáles son las ventajas de usar std :: set vs, por ejemplo, usando vectores o mapas. Parece que no puedo encontrar una respuesta explícita a esta pregunta. Noté que los conjuntos usan mapas, pero ¿por qué no siempre usar mapas o usar conjuntos? En cambio, se proporcionan 2 contenedores bastante similares. Gracias por adelantado.
Ningún cuerpo ha mencionado los hechos que std::set
es realmente inmutable. No debe cambiar el valor de ningún elemento en él. std::set
no realiza un seguimiento de los cambios, por lo tanto, cuando edita un elemento, va detrás de su parte posterior y es probable que cambie su orden interno. Este es un comportamiento arriesgado. Por lo tanto, use std::map
si desea editar elementos después de colocarlos en el contenedor. Asegúrese de utilizar la key
para inducir el pedido y todo lo que necesita cambiar posteriormente en value
.
Se trata de las garantías de complejidad más deseadas para su aplicación, con respecto a la inserción, eliminación, recuperación, etc. Recomiendo encarecidamente STL eficaz de Scott Meyers .
un conjunto es útil para almacenar cosas únicas como una enumeración para "typeOfFruits"
std::set<typeOfFruits> fruits;
fruits.insert (banana);
fruits.insert (apple);
fruits.insert (pineapple);
//it''s fast to know if my store sells a type of fruit.
if (fruits.find (pear) == fruits.end())
{ std::cout<<"i don''t have pear"; }
un mapa es útil para almacenar cosas únicas, más un ''valor''
std::map<typeOfFruits, double /*unit price*/> fruits;
fruits[banana] = 1.05;
fruits[apple] = 0.85;
fruits[pineapple] = 3.05;
//repeating pineapple will replace the old price (value)
fruits[pineapple] = 3.35;
//it''s fast to know how much a fruit costs.
std::map<typeOfFruits, double /*unit price*/> itr = fruits.find(pineapple);
if (itr != fruits.end())
{ std::cout<<"pineapples costs: $" <<itr->second; }
un vector es útil para almacenar cosas donde se ordena la secuencia (push_back ()). imagine que está escaneando sus frutas en el proceso de pago, y el programa sigue este escaneo.
std::vector<typeOfFruits> fruits;
fruits.push_back(apple);
fruits.push_back(apple);
fruits.push_back(apple);
fruits.push_back(banana);
fruits.push_back(banana);
fruits.push_back(pineapple);
//i scanned 3 apples, 2 bananas and 1 pineapple.
std::set
y std::map
son contenedores asociativos. La diferencia es que std::set
s solo contiene la clave, mientras que en std::map
hay un valor asociado. Elegir uno sobre el otro depende principalmente de lo que es la tarea en cuestión. Si desea construir un diccionario de todas las palabras que aparecen en un texto, puede usar std::set<std::string>
, pero si también desea contar cuántas veces apareció cada palabra (es decir, asociar un valor) a la clave), entonces necesitaría un std::map<std::string,int>
. Si no necesita asociar ese conteo, no tiene sentido tener el int
que es innecesario.
-
vector
es más rápido para inserciones y eliminaciones en la parte posterior del contenedor. Puede acceder a los elementos a través del operador []. -
dequeue
es similar alvector
pero presenta inserción frontal y eliminación. -
set
solo tiene la clave, mientras que elmap
tiene unpair
. Ambos contenedores son más rápidos para la inserción y eliminación en el medio del contenedor. También puede acceder a elementos a través de find con los algoritmos STL.