2010-07-28 21 views

Respuesta

11

La iteración ordenada no es un detalle de implementación; está garantizado por el estándar C++. Es una propiedad fundamental de todos los contenedores asociativos (C++ 03 §23.1.2/9):

La propiedad fundamental de los iteradores de contenedores asociativos es que iterar a través de los contenedores en el orden no descendente de claves donde no descendente se define por la comparación que se utilizó para construirlas. Para cualquier par de iteradores Dereferenceable i y j que tal distancia i-j es positivo,

value_comp(*j, *i) == false 

value_comp es el comparador con la que el mapa se construyó (por defecto, es std::less<T>).

+0

+1. Por supuesto, esto no es cierto para los tipos desordenados. – rlbond

+2

@rlbond: cierto. Sin embargo, C++ 03 no tiene contenedores asociativos desordenados y en C++ 0x se clasifican por separado (los "contenedores asociativos" son independientes de los "contenedores asociativos no ordenados"). –

2

Está garantizado por el estándar C++.

+0

Es genial si me puede indicar esta parte del estándar. – Thomson

0

Garantizado. Si desea algo que no esté restringido por este try boost :: unordered_map <>

+0

O, similarmente, 'std :: tr1 :: unordered_map <> '. – Frank

4

§23.1.2/2:

Cada contenedor asociativo es parametrizado en Key y un ordenamiento relación Compare que induce una estricta ordenamiento débil (25.3) en los elementos de Key. ... El objeto del tipo Compare es llamado el objeto de comparación de un contenedor . Este objeto de comparación puede ser un puntero a la función o un objeto de un tipo con un operador de llamada a función apropiado.

El objeto predeterminado Compare es la función menor que std::less<Key>.

El pedido es una propiedad de la función. Es un requisito, no un efecto secundario.

Ordenando los objetos son un efecto secundario. 23.1.2/10 y 23.1.2/9 (citado por James) garantizan que map/set y multimap/multiset tienen teclas de aumento/no disminución, respectivamente, en la secuencia de begin a end.

Cuestiones relacionadas