5

我使用以下结构作为 STLgenerate_n算法的输入:

struct GenerateNumber {     
    GenerateNumber () : i(0) {}
    int operator () (void) {        
        return  i++;
    }
private:
    int i;
};

使用此函子的代码示例是:

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);

但是,结果是两者都v1包含v2{0,1,2}而不是v2包含{3,4,5}。我已经用断点验证了GenerateNumber' 的构造函数只被调用一次(我知道构造函数被多次调用是没有意义的,但我还是检查了它)。

我知道我可以通过制作i静态来解决这个问题,但我不明白这种行为。i为什么在连续调用之间不保留的值?

4

2 回答 2

8

生成器对象在传递给时被复制generate_n。尝试使用std::ref,即

std::generate_n(v1.begin(), 3, std::ref(generateNumber));
std::generate_n(v2.begin(), 3, std::ref(generateNumber));

编辑:请注意,std::ref仅在 C++11 中可用。它在 TR1 as 中引入std::tr1::ref,并且在 boost as 中也可用boost::ref

于 2012-05-13T09:48:34.043 回答
3

std::generate_n按值获取函子,即复制它。可能是您没有检查是否调用了复制构造函数。

在没有 的情况下std::ref,并且如果您的问题在您的示例中被本地化,您可以修改您的仿函数以引用在调用范围内设置的计数器std::generate_n

struct GenerateNumber {     
    GenerateNumber (int& i) : struct GenerateNumber {     
    GenerateNumber () : i(0) {}
    int operator () (void) {        
        return  i++;
    }
private:
    int& i;
};

int main() {
  int counter = 0;
  std::vector <int> v1 (3);
  std::vector <int> v2 (3);
  GenerateNumber generateNumber(counter);
  std::generate_n (v1.begin (), 3, generateNumber);
  std::generate_n (v2.begin (), 3, generateNumber);

}
于 2012-05-13T09:49:24.790 回答