std::partycja w C++ STL
C++ ma klasę w swojej bibliotece algorytmów STL, która pozwala nam na łatwe algorytmy partycjonowania przy użyciu pewnych wbudowanych funkcji. Podział oznacza czynność podziału elementów kontenerów w zależności od zadanego stanu.
Operacje partycjonujące :
1. partycja (rozpocznij od warunku końcowego) :- Ta funkcja jest używana podziel elementy NA podstawa warunku wspomniano w jej argumentach.
2. is_partitioned (zacznij od warunku końcowego) :- Ta funkcja zwraca wartość logiczną true, jeśli kontener jest podzielony w przeciwnym razie zwraca wartość false.
// C++ code to demonstrate the working of // partition() and is_partitioned() #include #include // for partition algorithm #include // for vector using namespace std ; int main () { // Initializing vector vector < int > vect = { 2 1 5 6 8 7 }; // Checking if vector is partitioned // using is_partitioned() is_partitioned ( vect . begin () vect . end () []( int x ) { return x % 2 == 0 ; }) ? cout < < 'Vector is partitioned' : cout < < 'Vector is not partitioned' ; cout < < endl ; // partitioning vector using partition() partition ( vect . begin () vect . end () []( int x ) { return x % 2 == 0 ; }); // Checking if vector is partitioned // using is_partitioned() is_partitioned ( vect . begin () vect . end () []( int x ) { return x % 2 == 0 ; }) ? cout < < 'Now vector is partitioned after partition operation' : cout < < 'Vector is still not partitioned after partition operation' ; cout < < endl ; // Displaying partitioned Vector cout < < 'The partitioned vector is : ' ; for ( int & x : vect ) cout < < x < < ' ' ; return 0 ; }
Wyjście:
Vector is not partitioned Now vector is partitioned after partition operation The partitioned vector is : 2 8 6 5 1 7
W powyższym kodzie funkcja podziału wektora dzieli wektor w zależności od tego, czy element jest parzysty czy nieparzysty, elementy parzyste są dzielone od elementów nieparzystych w dowolnej kolejności.
3. partycja stabilna (zacznij od warunku końcowego) :- Ta funkcja jest używana podziel elementy NA podstawa warunku wspomniano w jej argumentacji w w taki sposób, aby zachować względną kolejność elementów. .
4. punkt_podziału (rozpocznij warunek końcowy) :- Ta funkcja zwraca iterator wskazujący punkt podziału kontenera, czyli pierwszy element w podzielonym zakresie [begend), dla którego warunek nie jest spełniony. Aby ta funkcja działała, kontener powinien być już podzielony na partycje.
// C++ code to demonstrate the working of // stable_partition() and partition_point() #include #include // for partition algorithm #include // for vector using namespace std ; int main () { // Initializing vector vector < int > vect = { 2 1 5 6 8 7 }; // partitioning vector using stable_partition() // in sorted order stable_partition ( vect . begin () vect . end () []( int x ) { return x % 2 == 0 ; }); // Displaying partitioned Vector cout < < 'The partitioned vector is : ' ; for ( int & x : vect ) cout < < x < < ' ' ; cout < < endl ; // Declaring iterator vector < int >:: iterator it1 ; // using partition_point() to get ending position of partition auto it = partition_point ( vect . begin () vect . end () []( int x ) { return x % 2 == 0 ; }); // Displaying partitioned Vector cout < < 'The vector elements returning true for condition are : ' ; for ( it1 = vect . begin (); it1 != it ; it1 ++ ) cout < < * it1 < < ' ' ; cout < < endl ; return 0 ; }
Wyjście:
The partitioned vector is : 2 6 8 1 5 7 The vector elements returning true for condition are : 2 6 8
W powyższym kodzie elementy parzyste i nieparzyste zostały podzielone w kolejności rosnącej (posortowane). Nie zawsze w kolejności rosnącej, chociaż tutaj elementy (parzyste i nieparzyste) pojawiały się w zwiększonej kolejności, podobnie jak wynik po podziale. jeśli vect miałby wartość { 217865 } po stable_partition(), byłby to { 286175 }. Kolejność występowania jest zachowana.
5. partycja_kopia (warunek początek, początek, początek, początek 2) :- Ta funkcja kopiuje podzielone elementy w różnych pojemnikach wymienionych w jej argumentach. Wymaga 5 argumentów. Pozycja początkowa i końcowa kontenera Pozycja początkowa nowego kontenera, z którego elementy mają zostać skopiowane (elementy zwracające wartość true dla warunku) Pozycja początkowa nowego kontenera, z którego należy skopiować inne elementy (elementy zwracające wartość false dla warunku) i warunek . Zmiana rozmiaru nowe kontenery jest konieczne dla tej funkcji.
// C++ code to demonstrate the working of // partition_copy() #include #include // for partition algorithm #include // for vector using namespace std ; int main () { // Initializing vector vector < int > vect = { 2 1 5 6 8 7 }; // Declaring vector1 vector < int > vect1 ; // Declaring vector1 vector < int > vect2 ; // Resizing vectors to suitable size using count_if() and resize() int n = count_if ( vect . begin () vect . end () []( int x ) { return x % 2 == 0 ; } ); vect1 . resize ( n ); vect2 . resize ( vect . size () - n ); // Using partition_copy() to copy partitions partition_copy ( vect . begin () vect . end () vect1 . begin () vect2 . begin () []( int x ) { return x % 2 == 0 ; }); // Displaying partitioned Vector cout < < 'The elements that return true for condition are : ' ; for ( int & x : vect1 ) cout < < x < < ' ' ; cout < < endl ; // Displaying partitioned Vector cout < < 'The elements that return false for condition are : ' ; for ( int & x : vect2 ) cout < < x < < ' ' ; cout < < endl ; return 0 ; }
Wyjście:
The elements that return true for condition are : 2 6 8 The elements that return false for condition are : 1 5 7