Проблема здесь в том, что transform
просто не является правильным выбором для поставленной задачи. Цель transform
состоит в том, чтобы взять некоторые входные данные, преобразовать каждый в некотором предписанном порядке и создать выходные данные для каждого из этих входных сигналов.
В этом случае не имеет каких-либо входов. transform
имело бы смысл, если бы значения в векторе (так или иначе) основывались на значениях в некотором существующем векторе.
generate_n
- действительно правильное решение проблемы - он предназначен для вызова некоторой функции / функтора N раз, выдачи N результатов и назначения их для выходного итератора (и его преемников), который вы предоставляете. Так как она предназначена для генерации значений (а не преобразования существующих значений), функция / функтор не принимает ввод, и вам не нужно предоставлять «поддельный» ввод.
Что касается «фиктивного» аргумента, то, если вы хотите / нуждаетесь в нем, это, вероятно, довольно хороший признак того, что (как в этом случае) вы используете неправильный алгоритм, и просто не должны этого делать.
Однако иногда вы попадаете в обратную ситуацию: вы хотите использовать алгоритм, который не предоставляет аргумент, но вы хотите иметь возможность предоставить аргумент. Например, предположим, что вы хотите иметь возможность установить числа в вашем массиве на случайное число с некоторой нижней и / или верхней границей, указанной пользователем. В этом случае вы хотите иметь возможность указать границы, которые будут переданы вашей функции случайных чисел, но ни generate
, ни generate_n
не имеют для этого никаких условий.
В этом случае у вас есть две возможности. Один из них - bind
(первоначально boost::bind
, но теперь включен в C ++ 11). Как правило, я предпочитаю использовать функтор, и я передаю аргумент (ы) в ctor:
class gen_random {
int lower;
int upper;
public:
gen_random(int lower = 0, int upper = RAND_MAX) : lower(lower), upper(upper) {}
int operator() { return rand_range(lower, upper);
};
int main() {
std::vector<int> rand_ints;
std::generate_n(std::back_inserter(rand_ints), 10, gen_random(1, 6));
return 0;
}