logo

std::partição em C++ STL

C++ tem uma classe em sua biblioteca de algoritmos STL que nos permite algoritmos de partição fáceis usando certas funções embutidas. Partição refere-se ao ato de dividir elementos de contêineres dependendo de uma determinada condição. 
Operações de partição :
1. partição (início da condição final) :- Esta função é usada para particionar os elementos sobre base da condição mencionado em seus argumentos.
2. is_partitioned (início da condição final) : - Esta função retorna booleano verdadeiro se o contêiner estiver particionado senão retorna falso.

CPP
// 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;   } 

Saída: 



string para char em java
Vector is not partitioned Now vector is partitioned after partition operation The partitioned vector is : 2 8 6 5 1 7

No código acima, a função de partição particiona o vetor dependendo se um elemento é par ou ímpar, os elementos pares são particionados dos elementos ímpares em nenhuma ordem específica. 
3. stable_partition (início da condição final) :- Esta função é usada para particionar os elementos sobre base da condição mencionado em seus argumentos em de forma que a ordem relativa dos elementos seja preservada. .
4. ponto_partição(início da condição final) : - Esta função retorna um iterador apontando para o ponto de partição do contêiner, ou seja, o primeiro elemento no intervalo particionado [begend) para o qual a condição não é verdadeira. O contêiner já deve estar particionado para que esta função funcione.

CPP
// 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;   } 

Saída: 

The partitioned vector is : 2 6 8 1 5 7 The vector elements returning true for condition are : 2 6 8

No código acima, os elementos pares e ímpares são particionados e em ordem crescente (classificados). Nem sempre em ordem crescente, embora aqui os elementos (pares e ímpares) tenham aparecido em ordem crescente, assim como o resultado após a partição. se vect fosse { 217865 } depois de stable_partition() seria  { 286175 }. A ordem de aparição é mantida.
5. partição_copy (início final beg1 condição beg2) : - Esta função copia os elementos particionados nos diferentes recipientes mencionados em seus argumentos. São necessários 5 argumentos. Posição inicial e final do contêiner Posição inicial do novo contêiner onde os elementos devem ser copiados (elementos retornando verdadeiros para condição) Posição inicial do novo contêiner onde outros elementos devem ser copiados (elementos retornando falso para condição) e a condição . Redimensionar novos contêineres é necessário para esta função.



CPP
// 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;  } 

Saída: 

The elements that return true for condition are : 2 6 8 The elements that return false for condition are : 1 5 7