2010-07-30 21 views
8

W jaki sposób są zdefiniowane obiekty użytkownika posortowane na mapie i ustawione? O ile mi wiadomo, mapy/zestawy są posortowane Pojemniki asocjacyjne: wstawiane elementy są sortowane na podstawie klucza, który zawiera.Porządek sortowania w mapie STL i zestaw

Ale mapa i zestaw wewnętrznie używają operator > do sortowania swoich elementów.

Z witryny SGI, mam następujące przykłady:

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; 
} 

w powyższym przykładzie, w jaki sposób są wartości sortowane?

Edit: Kod przeniesiony z komentarzem:

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; 

} 

jaki sposób wartości dostać sortowane?

Odpowiedz

8

std::map używa funktora do sortowania elementów. Domyślnie jest to std::less<Key>, który używa operator<. W twojej próbce znajduje się zdefiniowany przez użytkownika funktor ltstr, który pomoże uporządkować elementy według swoich kluczy w kolejności alfabetycznej.

+0

W zasadzie mapa używa klucza do sortowania wartości na podstawie std :: less, który używa operatora ronan

+1

Tak, używa operatora '' na końcu, jeśli nie podano jawnie argumentu szablonu. –

+0

@Kirill Używa komparatora do porównania kluczy, a nie elementów. – DumbCoder

3

Przede wszystkim domyślnie używany jest operator<, a nie operator>. W twoim przypadku przekazujesz funkcję porównywania niestandardowego, przekazując trzeci parametr szablonu podczas tworzenia obiektu mapy. Podczas wstawiania każdego elementu do mapy, ten funktor porównawczy służy do określania względnej kolejności obiektów na mapie, tj. Służy do porównywania kluczy. Na przykład, po wykonaniu months["february"] = 28;, mapa porównuje klucze "styczeń" i "luty". Ponieważ robimy porównywanie ciągów, to porównanie zwraca wartość większą niż 0. Ta wartość jest używana do określenia pozycji klucza "luty" w stosunku do "stycznia".

Powiązane problemy