Poniższy kod sortuje mapę według klawiszy w kolejności rosnącej, podczas tworzenia mapy:
mapa> mp = 'p', 1, 'n', 2, 'q', 3, 'm', 4, 'o', 5;
dla (mapa:: iterator Ite = mp.zaczynać(); Ite != MP.koniec(); ITE ++)
Cout << ite->Pierwszy << " => " << ite->drugi << endl;
Wyjście to:
M => 4
N => 2
O => 5
P => 1
Q => 3
Rzeczywisty kod dla komparatora tutaj jest „mniej”, w specjalizacji szablonu mapy. Poniższy kod sortuje mapę według kluczy w kolejności malejącej, podczas tworzenia mapy:
mapa> mp = 'p', 1, 'n', 2, 'q', 3, 'm', 4, 'o', 5;
dla (mapa:: iterator Ite = mp.zaczynać(); Ite != MP.koniec(); ITE ++)
Cout << ite->Pierwszy << " => " << ite->drugi << endl;
Wyjście to:
Q => 3
P => 1
O => 5
N => 2
M => 4
Rzeczywisty kod dla komparatora tutaj jest „większy” w specjalizacji szablonu mapy.
W przypadku powyższych próbek kodu biblioteka map jest zawarta w programie. Domyślna forma komparatora jest mniejsza. Tak więc można było pominąć w poprzednim kodzie,
mapaposeł
dla specjalizacji szablonu mapy.
Jeśli programista nie jest zadowolony z komparatora oferowanego przez C ++, programista może napisać własny. W tym artykule wyjaśniono, w jaki sposób programista może zastosować własny komparator na mapie. Normalne porównanie klawiszy łańcuchowych jest wrażliwe na przypadki. Zastosowany jest przykład porównania wrażliwego na przypadek.
Treść artykułu
Normalne porównanie kluczy strunowych
Rozważ klasę pięciu uczniów, aby uzyskać mapę imion przeciwko znakom, w teście, w następujący sposób:
Mary => 70
John => 60
Susan => 50
Paul => 45
Joseph => 75
Mapa C ++ dla domyślnego komparatora, mniej jest w programie:
#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()
mapamp = „Mary”, 70, „John”, 60, „susan”, 50, „Paul”, 45, „Joseph”, 75;
dla (mapa:: iterator Ite = mp.zaczynać(); Ite != MP.koniec(); ITE ++)
Cout << ite->Pierwszy << " => " << ite->drugi << endl;
powrót 0;
Wyjście to:
John => 60
Joseph => 75
Mary => 70
Paul => 45
Susan => 50
Porównanie jest wrażliwe na przypadki. Program zaczyna się od włączenia biblioteki iostream dla obiektu Cout. Następnie uwzględniono bibliotekę map; a następnie uwzględniona jest również biblioteka ciągów. Poniższe stwierdzenie zapewnia, że każda nazwa użyta w programie pochodzi ze standardowej przestrzeni nazw.
W funkcji Main () mapa jest zadeklarowana z inicjalizacją. Następny segment kodu w funkcji Main () wyświetla wynik posortowany (według klucza).
Niestandardowy operator porównawczy
Mniej niż niż<) operator of the string class of the C++ standard library is case-sensitive. If the programmer needs a case insensitive string literal less-than operator, he has to right his own operator function. An operator is actually a function that begins in a special way.
Z punktu widzenia użytkownika mniej niż działalność wynosi:
lewy < right
gdzie lewe i prawe są operandy. Ta operacja daje prawdziwie, jeśli lewy operand jest mniejszy niż prawy operand. Jeśli zdarzy się, że lewy operand jest taki sam jak prawy operand lub jest większy, daje fałszywe. Ten operator służy do sortowania w kolejności rosnącej.
Niestandardowy przypadek niewrażliwy na mniej niż niż operator porównawczy, dla literatu smyczkowego, to:
Bool operator () (char const* lewy, char const* prawy) const
dla (; *lewe != '\ 0' && *racja != '\ 0'; ++ lewy, ++ prawy)
if (Tolower (*po lewej) != Tolower (*po prawej))
Powrót (Tolower (*po lewej) < tolower(*right) );
W przeciwnym razie, jeśli ( *opuścił != *po prawej)
if ( *(lewy+1) == '\ 0' && *(po prawej+1) == '\ 0')
powrót (*w lewo < *right);
Powrót (Tolower (*po lewej) < tolower(*right));
Tutaj nie jest symbol operatora <; it is (), which is coded to mean <. The arguments, left and right, are for the left and right operands, respectively. “char const*” means the content characters cannot be changed. “const” just after the parameter list, means the key value (string) referenced, in the map, cannot be changed, relative to the key/value pair. This does not mean that the order of each key/value pair element in the map cannot be changed.
Pomimo faktu, że celowany mniej niż operator został zdefiniowany jako (), < is still used within the code.
For pętka porównuje literały lewej i prawej sznurki, charakteru, zaczynając od najmłodszych lat. Sprawdza, czy pierwsze znaki każdego operandu są takie same, gdy oba są małymi literami (nieczułe skrzynki). Jeśli nie są takie same, to prawda jest zwracana, jeśli lewy znak jest mniejszy niż prawy postać; W przeciwnym razie Fałsz jest zwracany; a funkcja operatora zatrzymuje iterację, ponieważ odpowiedź została uzyskana. Jeśli są takie same, to iteracja trwa z drugą odpowiadającą parą znaków.
Zanim porównanie będzie kontynuowane do drugiej odpowiadającej pary znaków, kod sprawdza, czy odpowiednie znaki były takie same, ale w różnych przypadkach; a jeśli literały strunowe były o tej samej długości i osiągnęły swoje cele. Jeśli wszystko jest prawdą, to „można” zostać napisane do sortowania zamówień malejących, ale nie zostanie to rozwiązane w tym artykule.
Specjalizacja szablonu porównawczego
Mówiąc prosto, lista parametrów szablonu mapy to:
szablon>
Zwróć uwagę na domyślny komparator mniej. Dla powyższej mapy, MP i dla nieczułego porównania, specjalizacja byłaby:
mapa
gdzie CICOMP jest komparatorem i jest to typ. Ten typ to nazwa struktury lub nazwa klasy. Struktura lub klasa zwykle ma tylko jeden element, który jest powyższą definicją funkcji operatora. W tej specjalizacji zamiast typu ciągów używano „const char*”.
W przypadku typu struktury członkowie nie poprzednio specyfikatora „publiczne:” są domyślnie publiczne. Ze typem klasy powyższa funkcja operatora musi być członkiem publicznym. Tak więc definicja typu struktury, byłaby:
struct cicomp
Bool operator () (char const* lewy, char const* prawy) const
dla (; *lewe != '\ 0' && *racja != '\ 0'; ++ lewy, ++ prawy)
if (Tolower (*po lewej) != Tolower (*po prawej))
Powrót (Tolower (*po lewej) < tolower(*right) );
W przeciwnym razie, jeśli ( *opuścił != *po prawej)
if ( *(lewy+1) == '\ 0' && *(po prawej+1) == '\ 0')
powrót (*w lewo < *right);
Powrót (Tolower (*po lewej) < tolower(*right));
;
Główną różnicą między dwiema definicjami jest użycie specyfikatora „publicznego:”. Definicja typu klasy byłaby:
klasa cicomp
publiczny:
Bool operator () (char const* lewy, char const* prawy) const
dla (; *lewe != '\ 0' && *racja != '\ 0'; ++ lewy, ++ prawy)
if (Tolower (*po lewej) != Tolower (*po prawej))
Powrót (Tolower (*po lewej) < tolower(*right) );
W przeciwnym razie, jeśli ( *opuścił != *po prawej)
if ( *(lewy+1) == '\ 0' && *(po prawej+1) == '\ 0')
powrót (*w lewo < *right);
Powrót (Tolower (*po lewej) < tolower(*right));
;
Program tego komparatora powinien rozpocząć się od:
#włączać <&iostreamgt;
#włączać <&mapgt;
#włączać <&cctypegt;
za pomocą przestrzeni nazw Std;
Biblioteka CCTYPE jest dla funkcji Tolower ().
Główna funkcja dla niestandardowego komparatora
Następująca funkcja C ++ main () dotyczy typu struktury lub typu klasy:
int main ()
mapamp = „Mary”, 70, „John”, 60, „susan”, 50, „Paul”, 45, „Joseph”, 75;
dla (mapa:: iterator Ite = mp.zaczynać(); Ite != MP.koniec(); ITE ++)
Cout << ite->Pierwszy << " => " << ite->drugi << endl;
powrót 0;
Wyjście jest,
John => 60
Joseph => 75
Mary => 70
Paul => 45
Susan => 50
W przypadku nieczułego komparatora string. Zauważ, że specjalizacja szablonu dla iteratora jest taka sama jak specjalizacja szablonu dla mapy.
Wniosek
Domyślny komparator sortowania map jest mniejszy. Komparator jest typem, którego nazwa jest trzecim argumentem deklaracji mapy, specjalizacji szablonu mapy. Ten typ może być struktura lub klasa, której prawdopodobnie jedynym członkiem jest definicja operatora niestandardowego. W tym artykule pokazano przypadek niestandardowego, mniej niż niż operatora. Inni operatorzy porównawcze można podobnie zdefiniować.