Есть вектор целых чисел. Нужно только с помощью стандартных алгоритмов 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, но нужно смотреть правде в глаза, для этой задачи обычный цикл проще:)
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости