Объединить несколько четных векторов - PullRequest
0 голосов
/ 30 апреля 2020

у меня п четного размера std::vector с. Предположим, что n = 3 и размер = 4:

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};

Я хочу получить вектор размером 4, у которого i-й член является суммой всех векторов i -ого члена. В примере

std::vector<int> x{6,7,8,9};

Какой самый лучший обобщенный c способ построения вектора x? Пожалуйста, придерживайтесь стандарта cpp17 в своем ответе.

Самым хорошим способом я хотел бы придерживаться <algorithm> вместо использования циклов.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Не существует алгоритма, который принимает диапазон диапазонов в качестве параметра (ну, они это делают, но неаккуратные алгоритмы работают с элементами, а не с элементами элементов). 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.

0 голосов
/ 30 апреля 2020

Если вы действительно решили использовать библиотеку algorithm, у вас может быть что-то вроде:

std::vector<int> tmp;
std::vector<int> result;

std::transform(
    std::begin(a), std::end(a),
    std::begin(b),
    std::back_inserter(tmp),
    [](int a, int b) { return a + b; }
);

std::transform(
    std::begin(c), std::end(c),
    std::begin(tmp),
    std::back_inserter(result),
    [](int a, int b) { return a + b; }
);

Недостатком является то, что вам понадобится один временный std::vector.

...