std::replace_if
поддерживает только замену элементов постоянным значением, указанным в качестве последнего аргумента. Однако, если вы чувствуете, что это имеет какой-то смысл для вас, вы можете написать свою собственную replace_if
функцию на основе эталонной реализации и заставить ее принимать какой-то генератор в качестве последнего параметра. Например:
template<class ForwardIt, class UnaryPredicate, class Generator>
void my_replace_if(ForwardIt first, ForwardIt last,
UnaryPredicate p, Generator g)
{
for (; first != last; ++first) {
if(p(*first)) {
*first = g();
}
}
}
bool IsOdd (int i) { return ((i%2)==1); }
int main(int argc, const char * argv[]) {
std::vector<int> foo{1,2,3,4,5,6,7};
std::vector<int> bar{10,20,30,40,50,60,70};
int i = 0;
my_replace_if (foo.begin(), foo.end(), IsOdd, [&bar, &i]()
{
return bar[i++];
});
for (auto el : foo)
{
std::cout << el << std::endl;
}
return 0;
}
===== EDIT =====
Как указывает anastaciu, индекс генератора должен увеличиваться с каждым шагом, а не только когда генератор
Например:
my_replace_if (foo.begin(), foo.end(),
[&i](int v) { i++; return ((v%2)==1); },
[&bar, &i]() { return bar[i-1]; });
Но, если честно, в данном случае это действительно излишне, и это даже не выглядит красиво.