Nel seguente programma C++ STL, definisco un functh Nth e restituisce true se viene revocato nell'ennesima volta. E lo trasformo nell'algoritmo generico remove_if, ottengo qualcosa strano.Un programma STL C++ che utilizza il predicato come predicato
Il codice:
#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 eseguo in Microsoft Visual Studio 2008 e ottengo il risultato: Cancella gli elementi 3 e 6 che non è che voglio. Ho pensato che solo 3 sarebbero stati cancellati. Qualcuno potrebbe interpretare per me? Grazie mille.
Per essere più precisi, ciò che l'OP desidera raggiungere è ancora possibile. Lo stato dovrebbe essere esternalizzato e passato al predicato sotto forma di riferimento mutabile. Quindi tutte le copie di un determinato predicato condivideranno lo stesso stato mutabile dell'originale. –