Если бы я хотел скопировать одно и то же значение в диапазоне итераторов, я бы подумал, что было бы легко иметь итератор noop, в котором вы передаете ему значение, и когда оно увеличивается, оно никуда не перемещается. Это позволит использовать существующие алгоритмы std::copy и std::copy_if.
Однако я не могу найти такого зверя. Придется ли мне сворачивать свое собственное?
Если он никуда не движется, как он остановится?





Используйте алгоритм std::fill или std::fill_n.
Некоторые контейнеры, т.е. std::vector<> и std::list<> имеют конструктор с размером и инициализатором:
std::vector<int> v(10, 42); // 42 is the initializer
v.resize(20, 42); // Initialize new elements with 42.
Не знаю, почему я не подумал об этом. Нужен кофеин. ;)
Отличительные особенности: один из самых опасных конструкторов в стандартной библиотеке :)
@lubgr, как так?
Если вы измените v(10, 42) на v{10, 42}, вы получите вектор размера 2 и элементы 10 и 42.
@lubgr С конструктором было все в порядке - пока не появилась юниформ-инициализация...
std::initializer_list, самый опасный тип для использования в конструкторе, особенно при дооснащении существующего контейнера
О, @lubgr, я думал, ты говоришь о std::fill.
@lubgr Просто чтобы обобщить вашу логику: любая функция, принимающая более одного аргумента одного и того же типа рядом друг с другом, опасна. Верно?
@KABoissonneault Это тоже не std::initializer_list, это равномерная инициализация, по крайней мере, в той форме, в которой она была введена — если v{{10, 42}} сделать обязательным, вообще никаких проблем ... Тем не менее я считаю v({10, 42}) (классическая инициализация в сочетании со списком инициализаторов) много читать далее удобочитаемый.
Насколько я знаю, для этого нет итератора, но есть алгоритм. std::generate возьмет диапазон и присвоит значение каждому элементу, возвращаемому переданным ему генератором. Например, если вы хотите назначить все 42, это будет выглядеть так:
std::vector<int> vec(20);
std::generate(vec.begin(), vec.end(), []() { return 42; });
Вы даже можете получить значения, которые меняются, например
std::vector<int> vec(20);
std::generate(vec.begin(), vec.end(), []() { static int counter = 0; ++counter; return counter * counter; });
@MaximEgorushkin, нет. Не тогда, когда у вас есть std::fill.
Я могу неправильно понять ваш вопрос, но
std::fillилиstd::fill_nмогут быть более подходящими для такой задачи?