我使用以下结构作为STL generate_n算法的输入:
struct GenerateNumber {
GenerateNumber () : i(0) {}
int operator () (void) {
return i++;
}
private:
int i;
};
Run Code Online (Sandbox Code Playgroud)
使用此仿函数的代码示例如下:
std::vector <int> v1 (3);
std::vector <int> v2 (3);
GenerateNumber generateNumber;
std::generate_n (v1.begin (), 3, generateNumber);
std::generate_n (v2.begin (), 3, generateNumber);
Run Code Online (Sandbox Code Playgroud)
但是,结果是既包含v1又v2包含{0,1,2},而不是v2包含{3,4,5}.我已经用断点验证了GenerateNumber构造函数只被调用一次(我知道构造函数被调用的次数没有多少,但我还是检查了它).
我知道我可以通过制作i静态来解决这个问题,但我不明白这种行为.为什么i连续通话之间没有保持价值?
传递给生成器对象时会被复制generate_n.尝试使用std::ref,即
std::generate_n(v1.begin(), 3, std::ref(generateNumber));
std::generate_n(v2.begin(), 3, std::ref(generateNumber));
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,std::ref仅在C++ 11中可用.它在TR1中被引入std::tr1::ref,并且也可以在boost中使用boost::ref.