2012-05-22 20 views
8

Tengo un vector<MyType> y me gustaría tener otro vector<MyType> que contenga solo aquellos MyTypes que cumplan con algunos criterios simples, p. que algún miembro de datos es igual a algo ¿Cuál es la mejor manera de resolver esto?Cómo filtrar o "grep" un vector C++?

Respuesta

17

Uso copy_if:

#include <algorithm> // for copy_if 
#include <iterator> // for back_inserter 

std::vector<MyType> v2; 
std::copy_if(v1.begin(), v1.end(), std::back_inserter(v2), 
      [](MyType const & x) { return simple_citerion(x); }); 
+2

maldición, 10 sec! +1 – Xeo

+2

Pero es importante tener en cuenta que 'copy_if' solo está en C++ 11, ¿verdad? –

+4

@EitanT: Sin embargo, puede abusar 'remove_copy_if' para C++ 03 invirtiendo el predicado. – Xeo

7

El uso de un poco de impulso, se puede:

std::vector<int> v = {1,2,-9,3}; 

for (auto i : v | filtered(_arg1 >=0)) 
    std::cout << i << "\n"; 

este ejemplo se utiliza Phoenix por lambdas implícitas definidas por plantilla de expresión (_arg1 >= 0), pero se puede utilizar cualquier invocable (C++ 03 o superior) con adaptadores Boost (montados, transformados, invertidos, etc.)

Consulte aquí para obtener más material de presentación y un completo l ejemplo:

+0

Otra buena forma, y ​​puede ampliar Boost.Range para crear un nuevo vector a partir del resultado filtrado, si lo necesita, sin guardar el resultado en un temporal. – Xeo