Есть ли итератор noop в stl?

#c #stl

#c #stl

Вопрос:

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

Однако, похоже, я не могу найти такого зверя. Мне придется запускать свой собственный?

Комментарии:

1. Возможно, я неправильно понимаю ваш вопрос здесь, но std::fill or std::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 .