C ++ kartkomparator

C ++ kartkomparator
Et kart er en listestruktur over elementer. Hvert element er et nøkkel/verdipar, og nøklene er unike. Et kart kan sorteres etter nøkler fra minste til største. I en slags beveger en nøkkel med tilsvarende verdi. Sortering i stigende rekkefølge som dette bruker kartkomparatoren til skjemaet, mindre enn ().

Følgende kode sorterer et kart etter nøkler i stigende rekkefølge, under opprettelsen av kartet:

kart> mp = 'p', 1, 'n', 2, 'q', 3, 'm', 4, 'o', 5;
for (kart:: iterator ite = mp.begynne(); ite != MP.slutt(); ITE ++)
cout << ite->først << " => "" << ite->sekund << endl;

Utgangen er:

M => 4
N => 2
O => 5
P => 1
Q => 3

Selve koden for komparatoren her, er "mindre", i kartmalspesialiseringen. Følgende kode sorterer et kart etter nøkler i synkende rekkefølge, under opprettelsen av kartet:

kart> mp = 'p', 1, 'n', 2, 'q', 3, 'm', 4, 'o', 5;
for (kart:: iterator ite = mp.begynne(); ite != MP.slutt(); ITE ++)
cout << ite->først << " => "" << ite->sekund << endl;

Utgangen er:

Q => 3
P => 1
O => 5
N => 2
M => 4

Selve koden for komparatoren her er "større" i kartmalspesialiseringen.

For ovennevnte kodeprøver er kartbiblioteket inkludert i programmet. Standard komparatorskjema er mindre. Så det kunne ha blitt utelatt i forrige kode å ha,

kart MP

for kartmalspesialisering.

Hvis programmereren ikke er fornøyd med komparatoren som tilbys av C ++, kan programmereren skrive sin egen. Denne artikkelen forklarer hvordan programmereren kan bruke sin egen komparator på kartet. Normal sammenligning av strengetastene er case-følsom. Eksemplet med case-ufølsom sammenligning brukes.

Artikkelinnhold

  • Normal sammenligning av strengetasjer
  • Tilpasset tilfelle ufølsom sammenligningsoperatør
  • Sammenligningsmalspesialisering
  • Hovedfunksjon for tilpasset komparator
  • Konklusjon

Normal sammenligning av strengetasjer

Tenk på en klasse på fem elever, for et kart over fornavn mot Marks, i en test, som følger:

Mary => 70
John => 60
Susan => 50
Paul => 45
Joseph => 75

Et C ++ -kart for standard komparator, mindre er i programmet:

#inkludere
#inkludere
#inkludere
ved hjelp av navneområdet STD;
int main ()

kart mp = "Mary", 70, "John", 60, "Susan", 50, "Paul", 45, "Joseph", 75;
for (kart:: iterator ite = mp.begynne(); ite != MP.slutt(); ITE ++)
cout << ite->først << " => "" << ite->sekund << endl;
retur 0;

Utgangen er:

John => 60
Joseph => 75
Mary => 70
Paul => 45
Susan => 50

Sammenligningen er saksfølsom. Programmet begynner med inkludering av iostream -biblioteket for cout -objektet. Deretter er kartbiblioteket inkludert; Og så er strengbiblioteket også inkludert. Uttalelsen som følger sikrer at ethvert navn som brukes i programmet er fra standard navneområdet med mindre annet er angitt.

I hovedfunksjonen () er kartet erklært med initialisering. Neste kodesegment i Main () -funksjonen viser det sorterte resultatet (etter nøkkel).

Tilpasset tilfelle ufølsom sammenligningsoperatør

Den mindre enn (<) 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.

Fra brukerens synspunkt er den mindre enn operasjonen:

venstre < right

Hvor venstre og høyre er operander. Denne operasjonen gir sann hvis venstre operand er mindre enn høyre operand. Hvis det hender at venstre operand er den samme som høyre operand eller er større, gir den falsk. Denne operatøren brukes til sortering i stigende rekkefølge.

En tilpasset sak ufølsom mindre enn sammenligningsoperatør, for strengen bokstavelig, er:

bool operatør () (char const* venstre, char const* høyre) const
for (; *igjen != '\ 0' && *rett != '\ 0'; ++ venstre, ++ høyre)
if (tolower (*til venstre) != Tolower (*til høyre))

Retur (Tolower (*til venstre) < tolower(*right) );

annet hvis ( *igjen != *Rett)

if ( *(venstre+1) == '\ 0' && *(høyre+1) == '\ 0')

Returner (*Venstre < *right);



Retur (Tolower (*til venstre) < tolower(*right));

Her er ikke symbolet for operatøren <; 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.

Til tross for at den målrettede mindre enn operatøren er blitt definert som (), < is still used within the code.

For-loop sammenligner venstre og høyre strenglitterale, karakter-for-karakter, som begynner fra venstre-mest-karakteren. Den sjekker om de første karakterene i hver operand er de samme når begge er i små bokstaver (tilfelle ufølsom). Hvis de ikke er de samme, blir ekte returnert hvis venstre karakter er mindre enn den høyre karakteren; Ellers blir falsk returnert; og operatørfunksjonen stopper iterasjonen fordi svaret er fått. Hvis de er de samme, fortsetter iterasjonen med det andre tilsvarende tegnparet.

Før sammenligningen fortsetter med det andre tilsvarende par tegn, sjekker kodene om de tilsvarende tegnene var de samme, men av forskjellige tilfeller; og hvis strenglitteralene var av samme lengde og har nådd endene. Hvis alle disse er sanne, kan det skrives for synkende ordensortering, men det vil ikke bli adressert i denne artikkelen.

Sammenligningsmalspesialisering

Enkelt sagt er malparameterlisten for kartet:

mal>

Legg merke til standardkomparatoren på mindre. For kartet ovenfor, MP, og for tilfelle ufølsom sammenligning, ville spesialiseringen være:

kart

der cicomp er komparatoren, og det er en type. Denne typen er navnet på en struktur eller navnet på en klasse. Strukturen eller klassen har vanligvis bare ett medlem, som er ovennevnte definisjon av operatørfunksjonen. I denne spesialiseringen har “const char*” blitt brukt i stedet for strengtypen.

Med strukturtypen er medlemmene som ikke er foran med spesifikasjonen, “Public:” som standard, offentlig. Med klassetypen må operatørfunksjonen ovenfor være et offentlig medlem. Så definisjonen av strukturtypen, ville være:

struct cicomp
bool operatør () (char const* venstre, char const* høyre) const
for (; *igjen != '\ 0' && *rett != '\ 0'; ++ venstre, ++ høyre)
if (tolower (*til venstre) != Tolower (*til høyre))

Retur (Tolower (*til venstre) < tolower(*right) );

annet hvis ( *igjen != *Rett)

if ( *(venstre+1) == '\ 0' && *(høyre+1) == '\ 0')

Returner (*Venstre < *right);



Retur (Tolower (*til venstre) < tolower(*right));

;

Hovedforskjellen mellom de to definisjonene er bruken av spesifikasjonen, "public:". Klassetypedefinisjonen ville være:

klasse cicomp
offentlig:
bool operatør () (char const* venstre, char const* høyre) const
for (; *igjen != '\ 0' && *rett != '\ 0'; ++ venstre, ++ høyre)
if (tolower (*til venstre) != Tolower (*til høyre))

Retur (Tolower (*til venstre) < tolower(*right) );

annet hvis ( *igjen != *Rett)

if ( *(venstre+1) == '\ 0' && *(høyre+1) == '\ 0')

Returner (*Venstre < *right);



Retur (Tolower (*til venstre) < tolower(*right));

;

Programmet for denne komparatoren skal begynne med:

#inkludere <&iostreamgt;
#inkludere <&mapgt;
#inkludere <&cctypegt;
ved hjelp av navneområdet STD;

CCTYPE -biblioteket er for tolower () -funksjonen.

Hovedfunksjon for tilpasset komparator

Følgende C ++ Main () -funksjon er for enten strukturtypen eller klassetypen:

int main ()

kart mp = "Mary", 70, "John", 60, "Susan", 50, "Paul", 45, "Joseph", 75;
for (kart:: iterator ite = mp.begynne(); ite != MP.slutt(); ITE ++)
cout << ite->først << " => "" << ite->sekund << endl;
retur 0;

Utgangen er,

John => 60
Joseph => 75
Mary => 70
Paul => 45
Susan => 50

for tilfelle ufølsom streng bokstavelig komparator. Merk at malspesialiseringen for iteratoren er den samme som malspesialiseringen for kartet.

Konklusjon

Standard komparator for kartsortering er mindre. Comparator er en type hvis navn er det tredje argumentet i MAP -erklæringen, av kartmalspesialiseringen. Denne typen kan være en struktur eller en klasse, hvis muligens bare medlem er en tilpasset operatørdefinisjon. Denne artikkelen har vist saken for en tilpasset, mindre enn operatør. Andre sammenligningsoperatører kan på samme måte defineres.