W poniższym programie C++ STL definiuję funktor Nth i zwraca on wartość true, jeśli jest odwołana w n-tym czasie. I przekształcam ją w ogólny algorytm remove_if, otrzymuję coś dziwne.Program C++ STL używający funktora jako predykatu
Kod:
#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;
}
go uruchomić w programie Microsoft Visual Studio 2008 i uzyskać wynik: usuwa elementy 3 i 6, które nie chcę. Myślałem, że tylko 3 zostaną usunięte. Czy ktoś może mnie interpretować? Wielkie dzięki.
Mówiąc bardziej precyzyjnie, to, co OP chce osiągnąć, jest nadal możliwe. Państwo powinno być uzewnętrznione i przekazane do orzeczenia pod postacią zmiennego odniesienia. Wtedy wszystkie kopie danego predykatu będą dzielić ten sam stan zmienny niż oryginał. –