Ustaw skrzyżowanie w C ++

Ustaw skrzyżowanie w C ++
Poniżej znajdują się zestawy dwóch znaków:
p = „h”, „g”, „f”, „e”, „d”
q = „j”, „i”, „h”, „g”, „f”

W C ++ przecięcie tych dwóch zestawów byłoby:

r = „f”, „g”, „h”

Ułożone w kolejności rosnącej na podstawie ustawień domyślnych. Możliwe jest przecięcie innych typów zestawów, takie jak przecięcie zestawów liczb całkowitych, przecięcie zestawów pływaków, przecięcie zestawów podwójnych itp.

Klasa SET w bibliotece zestawu C ++, która powinna być zawarta w programie dla zestawu, nie ma funkcji członka dla skrzyżowania. Aby uzyskać przecięcie zestawów, biblioteka algorytmu, która ma funkcję set_intersection (), musi zostać włączona do programu.

Biblioteka algorytmu C ++ ma wiele przeciążonych funkcji set_intersekcji. Tylko najprostsze dwa są wyjaśnione w tym artykule. Jednak przed rozpoczęciem wyjaśnień czytelnik musi znać różnicę między iteratorem wyjściowym, iteratorem wejściowym i iteratorem do przodu.

Outputiterator i forwarditerator

Iterator jest wskaźnikiem klasowym. Outputiterator jest iteratorem, do którego wartość może być przypisana z wyrażeniem z dereferencji. Na przykład, jeśli iteratorem jest ja dla liczb całkowitych,;

*i = 5;

sprawiłbym, że wskazuję lokalizację pamięci, która ma wartość, 5.

Inputiterator jest iteratorem, którego wyrażenie dereferencyjne zwróciłyby wartość, na którą wskazuje iterator. Na przykład, jeśli iterator jest i dla liczb całkowitych i wskazuje na lokalizację pamięci, która ma numer 7;

int num = *i;

sprawiłby, że wartość utrzyma, 5.

Forwarditerator jest opracowaną formą iteratora wejściowego.

Zakresy

Gdy wartości przeznaczone dla zestawu zostały włożone do zestawu, wartości zostaną sortowane w kolejności rosnącej na podstawie ustawień domyślnych. W przypadku zestawów można użyć dwóch iteratorów do przodu do identyfikacji zakresu elementów w zestawie. Ten artykuł dotyczy całego zakresu zestawu. Poniższy program pokazuje, jak uzyskać iteratory do przodu, które reprezentują cały zakres jednego zestawu:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

ustawić p = „h”, „g”, „f”, „e”, „d”;
ustawić:: Iterator pierwszy = P.zaczynać();
ustawić:: iterator last = p.koniec();
powrót 0;

Zwróć uwagę na użycie funkcji elementu początkowego () i end ().

Do celów przecięcia dwóch kompletnych zestawów pojawią się pierwsze 1 i ostatnie 1 dla pierwszego zestawu; oraz First2 i Last2 dla drugiego zestawu; dla obu kompletnych zakresów.

Iterator wyjściowy

Dwie funkcje set_intersekcji rozważane w tym artykule zwracają iterator wyjściowy. Niestety klasa zestawu nie ma iteratora wyjściowego. Cóż, klasa wektorowa ma. Oznacza to, że iterator wyjściowy klasy wektorowej, który jest po prostu nazywany iteratorem, może być używany do odbierania iteratora wyjściowego zwróconego przez funkcję set_intersection (). Kolejną dobrą wiadomością jest to, że ten iterator wektorowy może służyć zarówno jako iterator wyjściowy, jak i iterator wejściowy. Nie zapomnij uwzględnić wektora, aby użyć go w programie.

Dwie przeciążone funkcje set_intersekcji można teraz omówić.

Podstawowa funkcja set_intersection

Składnia tej funkcji w bibliotece algorytmu jest:

szablon
Constexpr Outputiterator
set_intersection (inputiterator1 First1, inuputiterator1 last1,
Inputiterator2 First2, inutputiterator2 Last2, wynik wyjściowy)

Outputiterator jest iteratorem wyjściowym powrotu, uzyskany z klasy wektorowej. Wskazywałoby to tuż po ostatnim praktycznym elemencie w wektorze. Oznacza to, że rozmiar pustego wektora, który odbiera przecięcie zestawów, należy oszacować na poziomie liczby wartości na skrzyżowaniu. Ostatnim wynikiem argumentu jest wyjściowy wskaźnik iteratora wskazujący na początek wektora, który odbędzie przecięcie zestawów.

Z wektorem powrócony iterator wyjściowy, który również jest iteratorem wejściowym, może być używany do wyświetlania wartości przecięcia zestawów za pomocą pętli. Z poprzednim wprowadzeniem do tego artykułu, reszta parametrów funkcji staje się oczywista. Poniższy program pokazuje, jak korzystać z tej funkcji:

#włączać
#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

ustawić p = „h”, „g”, „f”, „e”, „d”;
ustawić:: Iterator FIRST1 = P.zaczynać(); set :: iterator last1 = p.koniec();
ustawić q = „j”, „i”, „h”, „g”, „f”;
ustawić:: Iterator FIRST2 = q.zaczynać(); set :: iterator last2 = q.koniec();
wektor VTR (10);
wektor:: iterator outit = set_intersection (First1, Last1, First2, Last2, VTR.zaczynać());
vtr.Zmień rozmiar (outit - vtr.zaczynać());
for (outit = vtr.zaczynać(); Outit != vtr.koniec(); outit ++)
Cout << *outIt << ", ";
Cout << endl;
powrót 0;

Zauważ, że wektor musiał zostać zmieniony, aby zawierać tylko elementy skrzyżowania po wywołaniu funkcji set_intersection (). Wyjście to:

F, g, h,

Podstawowa funkcja set_intersection z niestandardowym porównanie

Składnia tej funkcji w bibliotece algorytmu to:

szablon
Constexpr Outputiterator
set_intersection (inputiterator1 First1, inuputiterator1 last1,
Inputiterator2 First2, inputiterator2 Last2,
Wynik wyjściowy, porównaj kompozycję);

Outputiterator jest iteratorem wyjściowym powrotu uzyskanym z klasy wektorowej. Byłoby to wskazanie tuż po ostatnim praktycznym elemencie wektora. Oznacza to, że rozmiar pustego wektora, który odbiera przecięcie zestawów, należy oszacować na poziomie liczby wartości na skrzyżowaniu. Wynikiem argumentu ostatniego, ale jeden jest wskaźnikiem iteratora wyjściowego wskazującego na początek wektora, który otrzyma przecięcie zestawów.

Z wektorem powrócony iterator wyjściowy, który również jest iteratorem wejściowym, może być używany do wyświetlania wartości przecięcia zestawów za pomocą pętli na pętlę.

Comp, jest funkcją zdefiniowaną przez programistę. To może być:

bool comp (char a, char b)
Jeśli != B)
zwrócić true;
w przeciwnym razie
zwrócić fałsz;

Ta funkcja COMP () zwraca prawda lub fałsz. Z wprowadzenia tego powyższego artykułu reszta parametrów funkcji set_intersection jest samoroznaczna.

W powyższym nagłówku programu następująca funkcja main () będzie pomyślnie użyć powyższej funkcji comp ().

int main ()

ustawić p = „h”, „g”, „f”, „e”, „d”;
ustawić:: Iterator FIRST1 = P.zaczynać(); ustawić:: iterator last1 = p.koniec();
ustawić q = „j”, „i”, „h”, „g”, „f”;
ustawić:: Iterator FIRST2 = q.zaczynać(); ustawić:: iterator last2 = q.koniec();
wektor VTR (10);
wektor:: iterator outit = set_intersection (First1, Last1, First2, Last2, VTR.początek (), comp);
vtr.Zmień rozmiar (outit - vtr.zaczynać());
for (outit = vtr.zaczynać(); Outit != vtr.koniec(); outit ++)
Cout << *outIt << ", ";
Cout << endl;
powrót 0;

Wyjście to:

F, g, h,

tak samo jak ostatnio.

Wniosek

Klasa SET w bibliotece zestawu C ++, która powinna być zawarta w programie dla zestawu, nie ma funkcji członka dla skrzyżowania. Aby uzyskać przecięcie zestawów, biblioteka algorytmu, która ma funkcję set_intersection (), musi zostać włączona do programu.

Biblioteka algorytmu C ++ ma wiele przeciążonych funkcji set_intersekcji. Od stycznia 2022 r. Dwie z tych funkcji, które najprawdopodobniej zostały wdrożone przez kompilatora, zostały wyjaśnione powyżej. Kompilatory wciąż mają zaimplementować resztę przeciążonych funkcji set_intersection () znalezionych w specyfikacji C ++.