[ Web Proxy ]
URL:
Viewing: http://es.cppreference.com/cpp/algorithm/remove [Back]  [Original]

std::remove, std::remove_if - cppreference.com
cppreference.com
Espacios de nombres
Variantes

std::remove, std::remove_if

De cppreference.com
 
 
Biblioteca de algoritmos
Polticas de ejecucin (C++17)
Operaciones de secuencia no modificantes
(C++11)(C++11)(C++11)
(C++17)
Operaciones de secuencia modificantes
Operaciones en almacenamiento no inicializado
Operaciones de particin
Operaciones de ordenacin
(C++11)
Operaciones de bsqueda binaria
Operaciones de conjuntos (en rangos ordenados)
Operaciones de pila
(C++11)
Operaciones mnimo/mximo
(C++11)
(C++17)
Permutaciones
Operaciones numricas
Bibliotecas C
 
Definido en el archivo de encabezado <algorithm>
template< class ForwardIt, class T > ForwardIt remove( ForwardIt first, ForwardIt last, const T& value );
(constexpr desde C++20)
(hasta C++26)
template< class ForwardIt, class T = typename std::iterator_traits
                                         <ForwardIt>::value_type >
constexpr ForwardIt remove( ForwardIt first, ForwardIt last,
                            const T& value );
(desde C++26)
template< class ExecutionPolicy, class ForwardIt, class T >
ForwardIt remove( ExecutionPolicy&& policy,
                  ForwardIt first, ForwardIt last, const T& value );
(desde C++17)
(hasta C++26)
template< class ExecutionPolicy, class ForwardIt,
          class T = typename std::iterator_traits
                        <ForwardIt>::value_type >
ForwardIt remove( ExecutionPolicy&& policy,
                  ForwardIt first, ForwardIt last, const T& value );
(desde C++26)
template< class ForwardIt, class UnaryPred > ForwardIt remove_if( ForwardIt first, ForwardIt last, UnaryPred p );
(3) (constexpr desde C++20)
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
ForwardIt remove_if( ExecutionPolicy&& policy,
                     ForwardIt first, ForwardIt last, UnaryPred p );
(4) (desde C++17)

Elimina todos los elementos que satisfacen un criterio especfico del rango [firstlast) y devuelve un iterador pasado el final para el nuevo final del rango.

1) Elimina todos los elementos que son iguales a value (usando operator==).
3) Elimina todos los elementos para los que el predicado p devuelve true.
2,4) Igual que (1,3), pero se ejecuta de acuerdo a la poltica de ejecucin policy.
Estas sobrecargas no participan en la resolucin de sobrecarga a menos que std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> (hasta C++20) std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> (desde C++20) sea verdadera.


Si el tipo valor de ForwardIt no es AsignablePorCopia, el comportamiento no est definido.

(hasta C++11)

Si el tipo de *first no es AsignablePorMovimiento, el comportamiento no est definido.

(desde C++11)

Explicacin

La eliminacin se realiza desplazando los elementos del rango de forma que los elementos que no se van a eliminar aparezcan al principio del rango.

  • El desplazamiento se realiza mediante la asignacin de copia (hasta C++11)asignacin de movimiento (desde C++11).
  • La operacin de eliminacin es estable: el orden relativo de los elementos que no se eliminarn permanece igual.
  • La secuencia subyacente de [firstlast) no se acorta mediante la operacin de eliminacin. Dado result como el iterador devuelto:
  • Cada elemento de [resultlast) tiene un estado vlido pero no especificado, porque la asignacin de movimiento puede eliminar elementos al moverse desde elementos que originalmente estaban en ese rango.
(desde C++11)

Parmetros

first, last - El rango de elementos a procesar.
value - El valor de los elementos a eliminar.
policy - La poltica de ejecucin a usar. Vase poltica de ejecucin para ms detalles.
p - Predicado unario que devuelve true Si el elemento debe ser eliminado..

La expresin p(v) debe ser convertible a bool para cada argumento v de tipo (posiblemente const) VT, donde VT es el tipo valor de ForwardIt, independientemente de la categora de valor, y no debe modificar v. Por lo tanto, no se admite un parmetro de tipo VT&, ni es VT a menos que para VT una operacin de movimiento sea equivalente a una copia (desde C++11).

Requisitos de tipo
-
ForwardIt debe satisfacer los requisitos de ForwardIterator.
-
UnaryPredicate debe satisfacer los requisitos de Predicado.

Valor de retorno

Iterador pasado del final para el nuevo rango de valores (si ste no es end, entonces apunta a un valor no especificado, al igual que los iteradores a cualquier valor entre este iterador y end).

Complejidad

Dada \(\scriptsize N\)N como std::distance(first, last):

1,2) Exactamente \(\scriptsize N\)N comparaciones usando operator==.
3,4) Exactamente \(\scriptsize N\)N aplicaciones del predicado p.

Excepciones

Las sobrecargas con un parmetro de plantilla llamado ExecutionPolicy (poltica de ejecucin) reportan errores tales que:

  • Si la ejecucin de una funcin invocada como parte del algoritmo lanza una excepcin y la poltica de ejecucin es una de las tres polticas estndar, se llama a std::terminate. Para cualquier otra poltica de ejecucin, el comportamiento est definido por la implementacin.
  • Si el algoritmo falla al asignar memoria, se lanza std::bad_alloc.

Posible implementacin

remove (1)
template<class ForwardIt, class T = typename std::iterator_traits<ForwardIt>::value_type>
ForwardIt remove(ForwardIt first, ForwardIt last, const T& value)
{
    first = std::find(first, last, value);
    if (first != last)
        for (ForwardIt i = first; ++i != last;)
            if (!(*i == value))
                *first++ = std::move(*i);
    return first;
}
remove_if (3)
template<class ForwardIt, class UnaryPred>
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPred p)
{
    first = std::find_if(first, last, p);
    if (first != last)
        for (ForwardIt i = first; ++i != last;)
            if (!p(*i))
                *first++ = std::move(*i);
    return first;
}

Notas

Una llamada a remove suele ir seguida de una llamada a la funcin miembro erase de un contenedor para eliminar elementos del contenedor. Estas dos invocaciones juntas constituyen lo que se denomina el modismo borrar-eliminar.

El mismo efecto tambin se puede lograr con las siguientes funciones no miembro:

  • std::erase, que tiene sobrecargas para todos los contenedores de secuencia estndar.
  • std::erase_if, que tiene sobrecargas para todos los contenedores estndar.
(desde C++20)

Las funciones miembro de nombre similar, de los contenedores list::remove, list::remove_if, forward_list::remove y forward_list::remove_if borran los elementos eliminados.

Estos algoritmos no se pueden utilizar con contenedores asociativos como std::set y std::map porque sus tipos de iterador no hacen desreferencia a los tipos AsignablePorMovimiento (las claves en estos contenedores no son modificables).

La biblioteca estndar tambin define una sobrecarga de std::remove en <cstdio>, que toma un const char* y se utiliza para eliminar archivos.

Debido a que std::remove toma value por referencia, puede tener un comportamiento no esperado si es una referencia a un elemento del rango [firstlast).


Macro de Prueba de caracterstica Valor Estndar Comentario
__cpp_lib_algorithm_default_value_type 202403 (C++26) inicializacin por lista para los algoritmos (1,2)

Ejemplo

El siguiente cdigo elimina todos los espacios de una cadena desplazando todos los caracteres que no son espacios a la izquierda y luego borrando el extra. Esto es un ejemplo del modismo borrar-eliminar.

#include <algorithm>
#include <cassert>
#include <cctype>
#include <complex>
#include <iostream>
#include <string>
#include <string_view>
#include <vector>

int main()
{
    std::string str1 {"Texto con algunos   espacios"};
    
    auto noSpaceEnd = std::remove(str1.begin(), str1.end(), ' ');
    
    // Los espacios se eliminan de la cadena solo lgicamente.
    // Usamos una vista sobre cadena, la cadena original an no se ha reducido:
    std::cout << std::string_view(str1.begin(), noSpaceEnd) 
              << " tamao: " << str1.size() << '\n';
    
    str1.erase(noSpaceEnd, str1.end());
    
    // Los espacios se eliminan de la cadena fsicamente.
    std::cout << str1 << " tamao: " << str1.size() << '\n';
    
    std::string str2 = "Texto\n con\talgunos \t  espacios en blanco\n\n";
    str2.erase(std::remove_if(str2.begin(), 
                              str2.end(),
                              [](unsigned char x) { return std::isspace(x); }),
               str2.end());
    std::cout << str2 << '\n';

    std::vector<std::complex<double>> nums{{2, 2}, {1, 3}, {4, 8}};
    #ifdef __cpp_lib_algorithm_default_value_type
        nums.erase(std::remove(nums.begin(), nums.end(), {1, 3}), nums.end());
    #else
        nums.erase(std::remove(nums.begin(), nums.end(), std::complex<double>{1, 3}),
                   nums.end());
    #endif
    assert((nums == std::vector<std::complex<double>>{{2, 2}, {4, 8}}));
}

Salida:

Textoconalgunosespacios tamao: 28
Textoconalgunosespacios tamao: 23
Textoconalgunosespaciosenblanco

Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estndares de C++ publicados anteriormente.

ID Aplicado a Comportamiento segn lo publicado Comportamiento correcto
LWG 283 C++98 Se requera que T fuera ComparableEnIgualdad, pero
el tipo valor de ForwardIt no siempre es T.
Se requiere que el tipo valor de ForwardIt
en su lugar sea AsignablePorCopia.

Vase tambin

Copia un rango de elementos omitiendo los que satisfacen un criterio especfico
(plantilla de funcin) [editar]
Elimina elementos duplicados consecutivos en un rango.
(plantilla de funcin) [editar]
Elimina elementos que satisfacen un criterio especfico.
(niebloid) [editar]

Web Proxy Viewer  |  New URL  |  Original Page