2012-05-22 19 views
8

Ho un vector<MyType> e vorrei un altro vector<MyType> contenente solo quei MyTypes che soddisfano alcuni criteri semplici, ad es. che alcuni membri di dati equivalgono a qualcosa. Qual è il modo migliore per risolvere questo?Come filtrare o "grep" un vettore C++?

risposta

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

dannazione, 10 sec! +1 – Xeo

+2

Ma è importante notare che 'copy_if' è solo in C++ 11, giusto? –

+4

@EitanT: è possibile abusare 'remove_copy_if' per C++ 03, invertendo il predicato. – Xeo

7

Usando un po 'di spinta, è possibile:

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

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

Questo esempio utilizza Phoenix per lambda impliciti definiti dal modello di espressione (_arg1 >= 0), ma è possibile utilizzare qualsiasi chiamabile (C++ 03 o superiore) con adattatori Boost (adattato, trasformato, invertito ecc.)

Vedere qui per altro materiale vetrina e un ful l esempio:

+0

Un altro buon modo, ed è possibile estendere Boost.Range per creare un nuovo vettore dal risultato filtrato, se necessario, senza salvare il risultato in modo temporaneo. – Xeo