#c #stl
#c #stl
Вопрос:
Если бы я хотел скопировать одно и то же значение в диапазоне итераторов, я бы подумал, что было бы легко иметь итератор noop, в котором вы передаете ему значение, и когда оно увеличивается, оно никуда не перемещается. Это позволило бы использовать существующие алгоритмы std::copy
и std::copy_if
.
Однако, похоже, я не могу найти такого зверя. Мне придется запускать свой собственный?
Комментарии:
1. Возможно, я неправильно понимаю ваш вопрос здесь, но
std::fill
orstd::fill_n
может быть более подходящим для такой задачи?2. Если он никуда не перемещается, как он остановится?
Ответ №1:
Используйте алгоритм 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.
Комментарии:
1. Я не знаю, почему я не подумал об этом. Нужно немного кофеина. 😉
2. Особенность: один из самых опасных конструкторов в стандартной библиотеке 🙂
3. @lubgr, как же так?
4. Если вы измените
v(10, 42)
наv{10, 42}
, вы получите вектор размером 2 и элементы 10 и 42.5.
std::initializer_list
, наиболее опасный тип для использования в конструкторе, особенно при модернизации в существующий контейнер
Ответ №2:
Насколько я знаю, для этого нет итератора, но есть алгоритм. 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; });
Комментарии:
1. @MaximEgorushkin, нет. Не тогда, когда у вас есть
std::fill
.