Quiero eliminar algunos elementos de un vector
y estoy usando el algoritmo remove_if
para hacer esto. Pero quiero hacer un seguimiento de los elementos eliminados para poder realizar alguna operación sobre ellos más tarde. He intentado esto con el siguiente código:Realizar un seguimiento de los elementos eliminados usando std :: remove_if
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
struct IsEven
{
bool operator()(int n)
{
if(n % 2 == 0)
{
evens.push_back(n);
return true;
}
return false;
}
vector<int> evens;
};
int main(int argc, char **argv)
{
vector<int> v;
for(int i = 0; i < 10; ++i)
{
v.push_back(i);
}
IsEven f;
vector<int>::iterator newEnd = remove_if(v.begin(), v.end(), f);
for(vector<int>::iterator it = f.evens.begin(); it != f.evens.end(); ++it)
{
cout<<*it<<"\n";
}
v.erase(newEnd, v.end());
return 0;
}
Pero esto no funciona como remove_if
acepta la copia de mi objeto funtor, por lo que el vector de la evens
almacenada no es accesible. ¿Cuál es la forma correcta de lograr esto?
P.S. : El ejemplo, con par y probabilidades es solo por ejemplo sake, mi código real es algo diferente. Por lo tanto, no sugiera una forma de identificar pares o probabilidades de manera diferente.
Puede pasar su functor por referencia. ¿Es aceptable una solución usando 'boost' o' C++ 11' (para pasar con 'ref')? – nabulke
Puede hacer lo siguiente 'for (vector :: iterator it = newEnd; it! = V.end(); ++ it) { cout << * it <<" \ n "; } v.erase (newEnd, v.end()); 'para obtener resultados correctos sin incluir' evens' –
megabyte1024
@ megabyte1024: No, eso no funciona. No se garantiza que los elementos que están más allá de 'newEnd' sean los elementos eliminados. – Asha