Voglio rimuovere alcuni elementi da un vector
e sto usando l'algoritmo remove_if
per fare questo. Ma voglio tenere traccia degli elementi rimossi in modo da poter eseguire qualche operazione su di essi in seguito. Ho provato questo con il seguente codice:Tenere traccia degli elementi rimossi 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;
}
Ma questo non funziona come remove_if
accetta l'copia del mio oggetto funtore, in modo che la stored evens
vettore non è accessibile. Qual è il modo corretto per raggiungere questo obiettivo?
P.S. : L'esempio, con odds e odds è solo per esempio, il mio vero codice è qualcosa di diverso. Quindi non suggerire un modo per identificare in modo uguale o dispari.
Potresti passare il tuo funtore per riferimento. Una soluzione è accettabile usando 'boost' o' C++ 11' (per passare con 'ref')? – nabulke
Si può fare ciò che segue 'for (vector :: iterator it = newEnd; it! = V.end(); ++ it) { cout << * it <<" \ n "; } v.erase (newEnd, v.end()); 'per ottenere risultati corretti senza coinvolgere' evens' –
megabyte1024
@ megabyte1024: No, non funziona. Gli elementi oltre 'newEnd' non sono garantiti come elementi rimossi. – Asha