La función std::copy_if de la biblioteca estándar de C++ copia los elementos de un rango (input range) a otro rango (output range), siempre que los elementos cumplan con una condición dada. Esta condición se define mediante un predicado que debe evaluarse a `true` para que el elemento sea copiado.
Veamos ejemplos de uso:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numeros = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::vector<int> pares;
// Copiar los números pares a 'pares'
std::copy_if(numeros.begin(), numeros.end(), std::back_inserter(pares), [](int n) {
return n % 2 == 0;
});
// Imprimir los números pares
std::cout << "Números pares: ";
for (int n : pares) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
Salida:
Números pares: 2 4 6 8 10
Veamos otro ejemplo:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
int main() {
std::vector<std::string> palabras = {"casa", "carro", "perro", "gato", "ciudad"};
std::vector<std::string> contieneLetraC;
// Copiar las palabras que contienen la letra 'c'
std::copy_if(palabras.begin(), palabras.end(), std::back_inserter(contieneLetraC), [](const std::string& palabra) {
return palabra.find('c') != std::string::npos;
});
// Imprimir las palabras que contienen la letra 'c'
std::cout << "Palabras con 'c': ";
for (const auto& palabra : contieneLetraC) {
std::cout << palabra << " ";
}
std::cout << std::endl;
return 0;
}
Salida:
Palabras con 'c': casa carro ciudad
Filtrar números negativos
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numeros = {5, -3, 7, -1, 9, -10, 0};
std::vector<int> negativos;
// Copiar los números negativos
std::copy_if(numeros.begin(), numeros.end(), std::back_inserter(negativos), [](int n) {
return n < 0;
});
// Imprimir los números negativos
std::cout << "Números negativos: ";
for (int n : negativos) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
Salida:
Números negativos: -3 -1 -10
Como linea general para utilizar copy_if podemos decir:
- std::copy_if recorre un rango de entrada y copia los elementos que satisfacen una condición dada al rango de salida.
- Necesitas un predicado (una función o lambda que retorne `true` o `false`) que defina qué elementos deben copiarse.
- Usa un iterator de salida, como `std::back_inserter`, para gestionar la inserción en el contenedor de destino sin necesidad de redimensionarlo manualmente.