Есть вектор целых чисел. Нужно только с помощью стандартных алгоритмов STL заменить каждый пятый элемент на 0.
Пытался с помощью replace_if, но но там 3м параметром передается значение текущего элемента, но ведь значение нас не интересует, только порядковый номер который должен делится на 5 без остатка. Возможно есть способ достать именно номер элемента, а не его значение, с помощью итераторов можно как-нибудь? Или просто есть другой алгоритм для такой задачи.
Типа
replace_if(v.begin(),v.end(),[](auto){ static int n = 0; return n++%5==0; },0);
не годится?
Еще вариант - сгенерировать последовательность единиц, каждый пятый - нуль, а потом применить transform
с умножением.
Еще вариант (без использования static переменной-счетчика, что для некоторых ситуаций в мультипоточной программе может быть полезным):
#include <vector>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
std::replace_if(v.begin(), v.end(), [&v](const auto& e) {
return ((&e - &v[0]) % 5) == 0;
}, 0);
for (auto i : v)
std::cout << i << std::endl;
}
Из стандартных алгоритмов только один позволяет использовать функтор с состоянием. Это std::for_each
. Таким образом переносимый вариант выглядит так:
struct Replace{
int counter = 0;
template<class T>
void operator()(T &value){
++counter;
if(counter == 5){
counter = 0;
value = 0;
}
}
};
std::for_each(v.begin(), v.end(), Replace());
PS: Если вы получили эту задачу в школе/в универе/на собеседовании, то скорее всего это вопрос с подвохом. Спрашивающий хочет подловить вас на незнании требований алгоритмов к функторам. Если эта проблема возникла сама собой, то проще всего будет сделать это при помощи обычного for
:
for(int i = 5; i < v.size(); i+=5){
v[i] = 0;
}
Я сам большой любитель stl, но нужно смотреть правде в глаза, для этой задачи обычный цикл проще:)
Виртуальный выделенный сервер (VDS) становится отличным выбором
Доброго времени суток, помогите решить задачуСделал скрипт на лендинге который по кнопке отправляет товар к корзину
Добрый деньНужно сделать анимацию, что бы при наведении на блок поднималась нижняя полоска заливая его фоном
Для ссылки определен стиль, как отменить его только для этого элемента?
Пытаюсь соединить базу данных с сервером GlassFish 41