2012-06-30 39 views
9

¿se ordenan los mapas STL?¿Están C++ std :: map <string, string> ordenados?

Específicamente, necesito saber si se ordena std :: map. Entonces, si lo repito, se repetirá con la primera cadena de inserción primero.

¿Entonces los siguientes iterarán A, C y B constantemente?

std::map<string,string> str_map; 

str_map.insert(std::make_pair("A","Data")); 
str_map.insert(std::make_pair("C","Data")); 
str_map.insert(std::make_pair("B","Data")); 
+4

Sí, puede pasar su propia función de comparación para que pueda ordenarla como desee. http://www.cplusplus.com/reference/stl/map/ – leetNightshade

+2

CodingQuant: En realidad, su ejemplo no es muy bueno, ya que no distingue entre dos significados de "ordenados": orden de inserción y orden lexicográfico. std :: map conserva el orden * lexicográfico *, no el orden de inserción. –

+3

@j_random_hacker: Para ser pedante, std :: map conserva el orden lexicográfico solo si su predicado de comparación se basa en una comparación lexicográfica. –

Respuesta

25

están clasificadas mapas STL?

Sí, un std::map<K,V> se ordena en base a la clave, K, utilizando std::less<K> para comparar objetos, de forma predeterminada.

Entonces, si lo repito, ¿se repetirá primero con la primera cadena de inserción?

No. Se repetirá en función del orden ordenado, no del orden en que se insertaron los elementos. En el caso de std::string, ordena en orden lexicográfico (orden alfabético).

Si desea iterar según el orden de inserción, es mejor utilizar un contenedor de secuencia, como std::vector o std::list.

+0

Gracias, pero ¿es el alfabético de clasificación? He actualizado la pregunta para poner C antes B. Muchas gracias – CodingHero

+0

@CodingQuant: respuesta actualizada en consecuencia. –

4

std::map s se ordenan utilizando el tipo dado operator< o utilizando una función de comparación personalizada/functor si se proporciona uno como argumento para el constructor.

Así que no, cuando itere sobre el mapa, el primer elemento que obtenga no será el que insertó primero; será el primero que aparecerá en orden alfabético.

Por supuesto, para su código de muestra que no hace la diferencia porque "A" es la primera clave que ha insertado y también la primera en orden alfabético.

+1

Por defecto std :: map usa 'std :: less '. Cómo funciona esto depende del tipo Key, pero para los tipos normales de STL suele ser 'operator <' –

Cuestiones relacionadas