2010-07-30 27 views
8

¿Cómo se ordenan y configuran los objetos definidos por el usuario? Hasta donde yo sé, el mapa/conjunto son contenedores asociativos ordenados: los elementos que se insertan se ordenan según la clave que contiene.Orden de clasificación en el mapa STL y establecer

Pero el mapa y el conjunto usan internamente operator > para ordenar sus elementos.

Desde el sitio de la SGI, tengo los siguientes ejemplos:

struct ltstr 
{ 
    bool operator()(const char* s1, const char* s2) const 
    { 
     return strcmp(s1, s2) < 0; 
    } 
}; 

int main() 
{ 
    map<const char*, int, ltstr> months; 

    months["january"] = 31; 
    months["february"] = 28; 
    months["march"] = 31; 
    months["april"] = 30; 
    months["may"] = 31; 
    months["june"] = 30; 
    months["july"] = 31; 
    months["august"] = 31; 
    months["september"] = 30; 
    months["october"] = 31; 
    months["november"] = 30; 
    months["december"] = 31; 

    cout << "june -> " << months["june"] << endl; 

    map<const char*, int, ltstr>::iterator cur = months.find("june"); 
    map<const char*, int, ltstr>::iterator prev = cur; 
    map<const char*, int, ltstr>::iterator next = cur; 

    ++next; 
    --prev; 

    cout << "Previous (in alphabetical order) is " << (*prev).first << endl; 
    cout << "Next (in alphabetical order) is " << (*next).first << endl; 
} 

En el ejemplo anterior, cómo se ordenan los valores?

Editar: Código trasladó desde comentario:

typedef map <string, int> Mint ; 

int main() 
{ 
    string Name ; 
    int Marks; 
    Mint Grade; 
    for (int i = 0; i<4; i++) 
    { 
     cin>> Name ; 
     cin >> Marks; 
     Grade [Name] = Marks ; 
    } 
    Mint :: iterator iter; 
    for(iter = Grade.begin(); iter != Grade.end(); iter++) 
     cout<< (*iter).first<<“ \t ” <<(*iter).second<<“\n” ; 
    return 0; 

} 

¿Cómo los valores solucionarse?

Respuesta

8

std::map usa un functor para ordenar los elementos. Por defecto es std::less<Key> que usa operator<. En su muestra hay un functor definido por el usuario ltstr que ayudará a ordenar los elementos de acuerdo con sus claves en orden alfabético.

+0

Entonces, básicamente, el mapa utiliza una clave para ordenar los valores en función de std :: less que utiliza el operador ronan

+1

Sí, usa 'operator <' al final si no especificó explícitamente el argumento de la plantilla. –

+0

@Kirill Utiliza el comparador para comparar las claves, no los elementos. – DumbCoder

3

En primer lugar, operator< se usa de manera predeterminada y no en operator>. En su caso, está pasando una función de comparación personalizada pasando el tercer parámetro de plantilla al crear el objeto de mapa. Al insertar cada elemento en el mapa, este funtor de comparación se usa para determinar el orden relativo del objeto en el mapa, es decir, se usa para comparar las teclas. Por ejemplo, cuando hace months["february"] = 28;, el mapa compara las teclas "enero" y "febrero". Como estamos haciendo una comparación de cadenas, esta comparación arroja un valor mayor a 0. Este valor se usa para determinar la posición de la clave "febrero" en relación con "enero".

Cuestiones relacionadas