Freigeben über


partition

 

Veröffentlicht: Juli 2016

Klassifiziert Elemente in einem Bereich in disjunkte zwei Sätze, wenn diese Elemente kein unäres Prädikat erfüllen, das die direkt vorausgeht, die es nicht erfüllen können.

Syntax

template<class BidirectionalIterator, class Predicate>
   BidirectionalIterator partition(
      BidirectionalIterator _First, 
      BidirectionalIterator _Last, 
      Predicate _Comp
   );

Parameter

  • _First
    Ein bidirektionalem Iterator, der die Position des ersten Elements im Bereich behandelt partitioniert werden.

  • _Last
    Ein bidirektionalem Iterator, der die Position eine hinter dem letzten Element im Bereich behandelt partitioniert werden.

  • _Comp
    Benutzerdefiniertes Prädikatfunktionsobjekt, das die erfüllt werden definiert Bedingung, wenn ein Element klassifiziert werden soll. Ein Prädikat akzeptiert ein einzelnes Argument und gibt true oder false zurück.

Rückgabewert

Ein bidirektionalem Iterator, der die Position des ersten Elements im Bereich behandelt, die Prädikatzustand nicht zu erfüllen.

Hinweise

Der Bereich, auf den verwiesen wird, gültig sein; muss alle Zeiger müssen dereferenzierbar befinden der Sequenz ist die letzte Position der ersten von Zunahme erreichbar.

Elemente a und b sind äquivalent, aber entsprechen nicht unbedingt, wenn sowohl Fotorezeptor (A, B) ist falsch und Fotorezeptor (b, A) wenn false, wo Fotorezeptor das Parameter-angegebene Prädikat ist. Der partition Algorithmus ist nicht stabil und garantiert nicht, dass die relative Position der entsprechenden Elemente beibehalten wird. Der Algorithmus stable_ partition behält diese ursprüngliche Reihenfolge bei.

Die Komplexität ist linear: Es sind (_Last - _First) Anwendungen von _Comp und höchstens (_Last - _First)/2 Austausche.

Beispiel

// alg_partition.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>

bool greater5 ( int value ) {
   return value >5;
}

int main( ) {
   using namespace std;
   vector <int> v1, v2;
   vector <int>::iterator Iter1, Iter2;

   int i;
   for ( i = 0 ; i <= 10 ; i++ )
   {
      v1.push_back( i );
   }
   random_shuffle( v1.begin( ), v1.end( ) );

   cout << "Vector v1 is ( " ;
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
   cout << ")." << endl;

   // Partition the range with predicate greater10
   partition ( v1.begin( ), v1.end( ), greater5 );
   cout << "The partitioned set of elements in v1 is: ( " ;
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
   cout << ")." << endl;
}

Beispielausgabe

Vector v1 is ( 10 1 9 2 0 5 7 3 4 6 8 ).
The partitioned set of elements in v1 is: ( 10 8 9 6 7 5 0 3 4 2 1 ).

Anforderungen

Header: <algorithm>

Namespace: std

Siehe auch

partition (STL-Beispiele)
Standard Template Library