En el siguiente programa STL de C++, defino un functor Nth y devuelve verdadero si es revocado en el enésimo tiempo. Y lo transformo en el algoritmo genérico remove_if, obtengo algo extraño.Un programa C++ STL que utiliza el functor como predicado
El código:
#include <iostream>
#include <list>
#include <algorithm>
#include "print.hpp"
using namespace std;
class Nth{
private:
int nth,ncount;
public:
Nth(int n):nth(n),ncount(0){}
bool operator()(int)
{
return ++ncount == nth;
}
};
int main()
{
list<int> col;
for (int i = 1;i <=9 ;++i)
{
col.push_back(i);
}
PRINT_ELEMENTS(col,"col : ");
list<int>::iterator pos;
pos = remove_if(col.begin(),col.end(),
Nth(3));
col.erase(pos,col.end());
PRINT_ELEMENTS(col,"nth removed : ");
}
print.hpp:
#include <iostream>
template <class T>
inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="")
{
typename T::const_iterator pos;
std::cout << optcstr;
for (pos=coll.begin(); pos!=coll.end(); ++pos) {
std::cout << *pos << ' ';
}
std::cout << std::endl;
}
lo ejecuto en Microsoft Visual Studio 2008 y obtener el resultado: Elimina los elementos 3 y 6 que no es lo que quiero. Pensé que solo 3 serían eliminados. ¿Podría alguien interpretar para mí? Muchas gracias.
Para ser más precisos, lo que el OP desea lograr todavía es posible. El estado debe externalizarse y pasar al predicado bajo la forma de una referencia mutable. Entonces, todas las copias de un predicado determinado compartirán el mismo estado mutable que el original. –