现在,这应该是really速度很快,因为循环不会执行。
就我个人而言,我可能会使用这样的东西:
struct gen_rand {
double range;
public:
gen_rand(double r=1.0) : range(r) {}
double operator()() {
return (rand()/(double)RAND_MAX) * range;
}
};
std::vector<double> x(num_items);
std::generate_n(x.begin(), num_items, gen_rand());
编辑:这纯粹是一种微观优化,可能根本没有什么区别,但您可能会考虑重新安排计算以获得类似的结果:
struct gen_rand {
double factor;
public:
gen_rand(double r=1.0) : factor(range/RAND_MAX) {}
double operator()() {
return rand() * factor;
}
};
当然,编译器很有可能已经这样做了(或类似的事情),但无论如何尝试一下也没有什么坏处(尽管它实际上只可能有助于关闭优化)。
Edit2:“sbi”(通常是这种情况)是正确的:通过最初保留空间,然后使用插入迭代器将数据放置到位,您可能会获得一些收益:
std::vector<double> x;
x.reserve(num_items);
std::generate_n(std::back_inserter(x), num_items, gen_rand());
和以前一样,我们正在进行如此微观的优化,我根本不确定我是否真的会这样做expect看看有什么不同。特别是,由于这一切都是通过模板完成的,因此很有可能大多数(如果不是全部)代码都是内联生成的。在这种情况下,优化器可能会注意到初始数据全部被覆盖,并跳过对其进行初始化。
然而,最后几乎是唯一真正真正的部分likely要产生显着的变化就是摆脱.at(i)
。其他might,但随着优化的开启,我真的不希望他们这样做。