Сейчас это должно быть действительно быстро, поскольку цикл не будет выполняться.
Лично я бы, наверное, использовал что-то вроде этого:
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());
Как и прежде, мы занимаемся такой микроскопической оптимизацией, я совсем не уверен, что действительно ожидаю , чтобы увидеть разницу вообще. В частности, поскольку все это делается с помощью шаблонов, есть большая вероятность того, что большая часть (если не все) кода будет сгенерирована встроенным образом. В этом случае оптимизатор может заметить, что все исходные данные перезаписываются, и пропустить их инициализацию.
В конце, однако, почти единственная часть, которая на самом деле , вероятно, , может существенно изменить ситуацию, - это избавление от .at(i)
. Другие могут , но с включенными оптимизациями я бы не ожидал их.