Angi kryss i C ++

Angi kryss i C ++
Følgende er to-karaktersett:
p = 'h', 'g', 'f', 'e', ​​'d'
q = 'j', 'i', 'h', 'g', 'f'

I C ++ ville skjæringspunktet mellom disse to settene være:

r = 'f', 'g', 'h'

ordnet i stigende rekkefølge basert på standardinnstillinger. Skjæringspunktet mellom andre setttyper er mulig, for eksempel skjæringspunkt mellom sett med heltall, skjæringspunkt mellom sett med flottører, skjæringspunkt mellom sett med dobler osv.

Set -klassen i C ++ SET -biblioteket, som skal inkluderes i programmet for fast arbeid, har ikke en medlemsfunksjon for kryss. Så for å få skjæringspunkt mellom sett, må algoritmebiblioteket, som har SET_Intersection () -funksjonen, inkluderes i programmet.

C ++ algoritmebiblioteket har en rekke set_interseksjon overbelastede funksjoner. Bare de enkleste to blir forklart i denne artikkelen. Imidlertid, før forklaringene starter, må leseren vite forskjellen mellom output iterator, input iterator og fremover iterator.

OutputIterator og ForwardIterator

En iterator er en klassepeker. En outputIterator er en iterator som en verdi kan tilordnes med det derfererte uttrykket. For eksempel, hvis iteratoren er for heltall, så;

*i = 5;

ville få jeg til å peke på minneplassen som har verdien, 5.

En inputIterator er en iterator hvis derfererte uttrykk vil returnere verdien iteratoren peker på. For eksempel, hvis iteratoren er for heltall, og peker på minneplassen som har nummer 7, så;

int num = *i;

ville få NUM til å holde verdien, 5.

En ForwardIterator er en utdypet form av inngangs iterator.

Rekkevidde

Når verdiene beregnet på et sett er satt inn i settet, blir verdiene sortert i stigende rekkefølge basert på standardinnstillinger. Med sett kan to fremover iteratorer brukes til å identifisere en rekke elementer i settet. Denne artikkelen er opptatt av hele settet av settet. Følgende program viser hvordan du får fremover iteratorer som representerer hele området for ett sett:

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

sett p = 'h', 'g', 'f', 'e', ​​'d';
sett:: iterator først = P.begynne();
sett:: iterator sist = P.slutt();
retur 0;

Legg merke til bruken av BEGIN () og END () Medlemsfunksjonene til SET -klassen.

For skjæringspunktet mellom to komplette sett, vil det være First1 og Last1 for det første settet; og First2 og Last2 for det andre settet; for begge komplette områder.

Utgang iterator

De to set_interseksjonsfunksjonene som er vurdert i denne artikkelen, returner en output iterator. Dessverre har ikke setklassen en output iterator. Vel, vektorklassen har. Dette betyr at output iterator for vektorklassen som ganske enkelt kalles iterator, kan brukes til å motta utdata -iteratoren returnert av SET_Interseksjon () -funksjonen. En annen god nyhet er at denne vektor iteratoren kan tjene som både output iterator og input iterator. Ikke glem å inkludere vektoren for å bruke den i programmet.

De to set_interseksjonene overbelastede funksjoner nevnt ovenfor kan nå diskuteres.

Grunnleggende set_interseksjonsfunksjon

Syntaksen for denne funksjonen i algoritmebiblioteket, er:

mal
ConstExpr OutputIterator
set_interseksjon (inputIterator1 First1, InputIterator1 Last1,
InputIterator2 First2, InputIterator2 Last2, OutputIterator Resultat)

OutputIterator er returneratoren, hentet fra vektorklassen. Det ville peke rett etter det siste praktiske elementet i vektoren. Dette betyr at størrelsen på den tomme vektoren for å motta skjæringspunktet mellom sett må estimeres til å være over antall verdier i krysset. Det siste argumentresultatet er utgang iteratorpekeren som peker på starten av vektoren, som vil motta skjæringspunktet mellom sett.

Med vektoren returneres output iteratoren, som også tilfeldigvis er en input iterator, brukes til å vise verdiene i skjæringspunktet mellom sett ved hjelp av For-loop. Med den foregående introduksjonen for denne artikkelen, blir resten av parametrene til funksjonen selvforklarende. Følgende program viser hvordan du bruker denne funksjonen:

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

sett p = 'h', 'g', 'f', 'e', ​​'d';
sett:: Iterator First1 = P.begynne(); Sett :: Iterator Last1 = P.slutt();
sett q = 'j', 'i', 'h', 'g', 'f';
sett:: iterator first2 = q.begynne(); Sett :: iterator last2 = q.slutt();
vektor VTR (10);
vektor:: Iterator Outit = Set_Intersection (First1, Last1, First2, Last2, VTR.begynne());
VTR.Endre størrelse (Outit - VTR.begynne());
for (Outit = VTR.begynne(); Outit != VTR.slutt(); Outit ++)
cout << *outIt << ", ";
cout << endl;
retur 0;

Legg merke til at vektoren måtte endres for å bare inneholde elementene i krysset etter at set_interseksjon () -funksjonen hadde blitt kalt. Utgangen er:

F, g, h,

Grunnleggende set_interseksjonsfunksjon med tilpasset sammenligning

Syntaksen for denne funksjonen i algoritmebiblioteket er:

mal
ConstExpr OutputIterator
set_interseksjon (inputIterator1 First1, InputIterator1 Last1,
InputIterator2 First2, InputIterator2 Last2,
OutputIterator -resultat, sammenligne komp);

OutputIterator er returutgangs iterator hentet fra vektorklassen. Det ville peke rett etter det siste praktiske elementet i vektoren. Dette betyr at størrelsen på den tomme vektoren for å motta skjæringspunktet mellom sett må estimeres til å være over antall verdier i krysset. Det siste-men-ett-argumentresultatet er utgang iteratorpekeren som peker på starten av vektoren, som vil motta skjæringspunktet mellom sett.

Med vektoren returneres output iteratoren, som også tilfeldigvis er en input iterator, brukes til å vise verdiene i skjæringspunktet mellom sett ved hjelp av for-loop.

Comp, er en programmererdefinert funksjon. Det kan bli:

bool comp (char a, char b)
hvis en != b)
return True;
ellers
return falsk;

Denne komp () -funksjonen returnerer sann eller falsk. Fra introduksjonen av denne artikkelen ovenfor er resten av parametrene for SET_Interseksjonsfunksjonen selvforklarende.

Med programmet ovenfor vil følgende main () -funksjon bruke ovennevnte Comp () -funksjon.

int main ()

sett p = 'h', 'g', 'f', 'e', ​​'d';
sett:: Iterator First1 = P.begynne(); sett:: iterator last1 = p.slutt();
sett q = 'j', 'i', 'h', 'g', 'f';
sett:: iterator first2 = q.begynne(); sett:: iterator last2 = q.slutt();
vektor VTR (10);
vektor:: Iterator Outit = Set_Intersection (First1, Last1, First2, Last2, VTR.begynn (), komp);
VTR.Endre størrelse (Outit - VTR.begynne());
for (Outit = VTR.begynne(); Outit != VTR.slutt(); Outit ++)
cout << *outIt << ", ";
cout << endl;
retur 0;

Utgangen er:

F, g, h,

samme som før.

Konklusjon

Set -klassen i C ++ SET -biblioteket, som skal inkluderes i programmet for fast arbeid, har ikke en medlemsfunksjon for kryss. Så for å få skjæringspunkt mellom sett, må algoritmebiblioteket, som har SET_Intersection () -funksjonen, inkluderes i programmet.

C ++ algoritmebiblioteket har en rekke set_interseksjon overbelastede funksjoner. Fra januar 2022 er to av disse funksjonene som mest sannsynlig er implementert av kompilatoren din, blitt forklart ovenfor. Kompilatorer skal fremdeles implementere resten av de overbelastede set_interseksjon () -funksjonene som finnes i C ++ -spesifikasjonen.