Не существует алгоритма, который принимает диапазон диапазонов в качестве параметра (ну, они это делают, но неаккуратные алгоритмы работают с элементами, а не с элементами элементов). std::ranges
, вероятно, поможет, но если вы хотите придерживаться C ++ 17, вы можете использовать только существующий алгоритм с некоторыми искажениями или написать свой собственный.
#include <vector>
#include <iostream>
template <typename IT,typename...Args>
void copy_sum(IT begin, IT end, IT to, Args... others) {
for (; begin != end; ++begin,++to){
*to = *begin + (*others++ + ...);
}
}
int main(){
std::vector<int> a {1,2,3,4};
std::vector<int> b {2,2,2,2};
std::vector<int> c {3,3,3,3};
//std::vector<std::vector<int>> combinedVectors {a,b,c};
std::vector<int> result(a.size());
copy_sum(a.begin(),a.end(),result.begin(),b.begin(),c.begin());
for (auto e : result) std::cout << e << " ";
}
Обратите внимание, что я не использовал combinedVectors
. Если вы хотите остаться generi c, тогда передайте итераторы, а не контейнер. Тем не менее, вышеперечисленное может выиграть от помощника, который берет begin
и end
для ряда элементов в combinedVectors
и перенаправляет их begin
и end
на copy_sum
.
Однако, это не совсем то, что я бы назвал «самым хорошим», и простой l oop, вероятно, непобедим в удобочитаемости, пока вы остаетесь с C ++ 17.