В этом question показано, как использовать erase/remove_if на основе векторных индексов с использованием предиката функции. Это хорошо работает при первом вызове функции, но поскольку локальная статическая переменная поддерживает состояние, при следующем вызове другого вектора мне будет не повезло. Поэтому я думал, что могу использовать функтор с частной переменной, которая была бы повторно использована. В основном это работает, за исключением первого элемента. Там что-то специфичные для пути remove_if использует функтор, путает инициализацию частной переменнойremove_if на основе векторного индекса с функтором
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
using namespace std;
class is_IndexEven_Functor {
public:
is_IndexEven_Functor() : k(0) {}
bool operator()(const int &i) {
cout << "DEBUG: isIndexEvenFunctor: k " << k << "\ti " << i << endl; ////
if(k++ % 2 == 0) {
return true;
} else {
return false;
}
}
private:
int k;
};
int main() {
is_IndexEven_Functor a;
a(0);
a(1);
a(2);
a(3);
vector<int> v;
v.push_back(0);
v.push_back(1);
v.push_back(2);
v.push_back(3);
cout << "\nBefore\n";
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " ")); cout << endl;
is_IndexEven_Functor b;
v.erase(remove_if(v.begin(), v.end(), b), v.end());
cout << "\nAfter\n";
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " ")); cout << endl;
return 0;
}
Вот вывод:
DEBUG: isIndexEvenFunctor: k 0 i 0
DEBUG: isIndexEvenFunctor: k 1 i 1
DEBUG: isIndexEvenFunctor: k 2 i 2
DEBUG: isIndexEvenFunctor: k 3 i 3
Before
0 1 2 3
DEBUG: isIndexEvenFunctor: k 0 i 0
DEBUG: isIndexEvenFunctor: k 0 i 1 // why is k == 0 here ???
DEBUG: isIndexEvenFunctor: k 1 i 2
DEBUG: isIndexEvenFunctor: k 2 i 3
After
2
Суть вопроса почему значение k
равно 0 во втором вызове функтора (и как его исправить)? Я предполагаю, что это имеет какое-то отношение к remove_if, используя его как временный объект или что-то, но я не совсем понимаю, что это значит.
EDIT: было бы здорово, если бы я мог избежать C++ 11
Спасибо, это прекрасно работает с C++ 11. Есть ли решение для C++ 03? – confusedCoder
@confusedCoder: Я добавил пример. –
@confusedCoder: вы также можете легко сделать свой собственный 'reference_wrapper'. –