Добавление векторов двойников разного размера в C ++ - PullRequest
3 голосов
/ 31 августа 2010

У меня есть несколько векторных контейнеров различного размера, каждый из которых содержит двойные числа.Я хотел бы добавить элементы каждого вектора, чтобы создать один вектор двойников.Этот простой пример будет примером того, о чем я говорю:

Рассмотрим два вектора A с тремя элементами 3.0 2.0 1.0 и B с двумя элементами 2.0 1.0.Я хотел бы добавить оба вектора, начиная с последнего элемента и работая в обратном направлении.Это дало бы массив C с записями 3.0 4.0 2.0.

Каким будет самый элегантный / эффективный способ сделать это?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 31 августа 2010

Попробуйте это с итераторами:

#include <vector>

void add(
        std::vector<double>& result,
        const std::vector<double>& a,
        const std::vector<double>& b)
{
    std::vector<double>::const_reverse_iterator sit;
    std::vector<double>::const_reverse_iterator send;

    // copy the larger vector
    if (a.size() > b.size() ) {
        result = a;
        sit  = b.rbegin();
        send = b.rend();
    }
    else {
        result = b;
        sit  = a.rbegin();
        send = a.rend();
    }

    // add the smaller one, starting from the back
    for (std::vector<double>::reverse_iterator it = result.rbegin();
            sit != send;
            ++it, ++sit)
    {
        *it += *sit;
    }
}
4 голосов
/ 31 августа 2010

Как только вы знаете, что у вас есть один вектор, который больше, чем другой

std::vector<double> new_vector = bigger_vector; // Copy the largest
std::transform(smaller_vector.rbegin(), smaller_vector.rend(), // iterate over the complete smaller vector 
    bigger_vector.rbegin(), // 2nd input is the corresponding entries of the larger vector  
    new_vector.rbegin(),    // Output is the new vector 
    std::plus<double>());   // Add em

Это хорошо, потому что вам не нужно делать никаких отступов цикла, и работает с любым контейнером последовательности, который поддерживает обратные итераторы.

3 голосов
/ 31 августа 2010

Скопируйте больший вектор в C и затем добавьте (+ =) элементы меньшего к связанным элементам C.

Что-то вроде:

std::vector<double> add(const std::vector<double>& a,
                        const std::vector<double>& b)
{
    std::vector<double> c( (a.size() > b.size()) ? a : b );
    const std::vector<double>& aux = (a.size() > b.size() ? b : a);
    size_t diff = c.size() - aux.size();

    for (size_t i = diff; i < c.size(); ++i)
        c[i] += aux[i-diff];

    return c;
}

ПравитьИсходя из комментариев ниже, возражающих против использования [] против итераторов.

Лично я считаю, что итераторы слишком многословны для чего-то подобного, но если вы предпочитаете их, то вы можете попробовать что-то вроде следующего:

std::vector<double> add(const std::vector<double>& a, 
                        const std::vector<double>& b)
{
    std::vector<double> c( (a.size() > b.size()) ? a : b);
    std::vector<double>::reverse_iterator c_i;

    const std::vector<double>& aux = (a.size() > b.size()) ? b : a;
    std::vector<double>::const_reverse_iterator aux_i;

    for (c_i=c.rbegin(), aux_i=aux.rbegin(); aux_i!=aux.rend(); ++c_i, ++aux_i)
        *c_i += *aux_i;

    return c;
}

Я не тестировал и не компилировал ни один из них, но я думаю, что вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...