Compartir a través de


remove_copy_if

Copia los elementos de un intervalo de origen a un rango de destino, salvo que satisfaciendo un predicado no se copian, sin perturbar el orden de los elementos restantes y devolver el final de un nuevo intervalo de destino.

template<class InputIterator, class OutputIterator, class Predicate>
   OutputIterator remove_copy_if(
      InputIterator _First, 
      InputIterator _Last, 
      OutputIterator _Result,
      Predicate _Pred
   );

Parámetros

  • _First
    Un iterador de entrada que dirige la posición del primer elemento del intervalo de donde se están quitando los elementos.

  • _Last
    Un iterador de entrada que dirige la posición una más allá del último elemento en el intervalo de donde se están quitando los elementos.

  • _Result
    Un iterador de salida que dirige la posición del primer elemento del intervalo de destino al que se están quitando los elementos.

  • _Pred
    El predicado unario que debe ser cumplido es el valor de un elemento debe reemplazarse.

Valor devuelto

Un iterador hacia delante que dirige la nueva posición final del intervalo de destino, una más allá del último elemento de la secuencia el remanente libre de los elementos que satisfacen el predicado.

Comentarios

El intervalo de origen hace referencia debe ser válido; todos los punteros deben ser dereferenceable y dentro de la secuencia la posición última es accesible de primera por el aumento.

Debe haber suficiente espacio en el rango de destino para contener los elementos del remanente que se copiarán después de que los elementos de valor especificado se eliminan.

El orden de los elementos no colocados permanece estable.

operator== utilizado para determinar la igualdad entre los elementos debe imponer una relación de equivalencia entre sus operandos.

la complejidad es lineal: hay (_Last – _First) comparaciones de igualdad y como máximo (_Last – _First) las asignaciones.

remove_copy_if tiene dos formularios relacionados:

Para obtener información sobre cómo estas funciones se comportan, vea Iteradores comprobados.

Ejemplo

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

bool greater6 ( int value ) {
   return value >6;
}

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

   int i;
   for ( i = 0 ; i <= 9 ; i++ )
      v1.push_back( i );

   int ii;
   for ( ii = 0 ; ii <= 3 ; ii++ )
      v1.push_back( 7 );
   
   random_shuffle ( v1.begin( ), v1.end( ) );
   cout << "The original vector v1 is:      ( " ;
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
   cout << ")." << endl;

   // Remove elements with a value greater than 6
   new_end = remove_copy_if ( v1.begin( ), v1.end( ), 
      v2.begin( ), greater6 );

   cout << "After the appliation of remove_copy_if to v1,\n "
        << "vector v1 is left unchanged as ( " ;
   for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
      cout << *Iter1 << " ";
   cout << ")." << endl;

   cout << "Vector v2 is a copy of v1 with values greater "
        << "than 6 removed:\n ( " ;
   for ( Iter2 = v2.begin( ) ; Iter2 != new_end ; Iter2++ )
      cout << *Iter2 << " ";
   cout << ")." << endl;
}

Resultados del ejemplo

The original vector v1 is:      ( 7 1 9 2 0 7 7 3 4 6 8 5 7 7 ).
After the appliation of remove_copy_if to v1,
 vector v1 is left unchanged as ( 7 1 9 2 0 7 7 3 4 6 8 5 7 7 ).
Vector v2 is a copy of v1 with values greater than 6 removed:
 ( 1 2 0 3 4 6 5 ).

Requisitos

encabezado: <algoritmo>

espacio de nombres: std

Vea también

Referencia

remove_copy_if (STL Samples)

Biblioteca de plantillas estándar