这个问题展示了如何使用基于函数谓词的erase/remove_if删除vector索引。这在第一次调用函数时很有效,但由于局部静态变量保持状态,在下一次调用不同的向量时会出现问题。因此,我想使用一个具有可重复使用私有变量的函数对象。它大部分工作正常,除了第一个元素。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将其用作临时对象有关,但我不太理解这意味着什么。
编辑:如果能避免使用c++11就更好了。
reference_wrapper
。 - Vaughn Cato