在C ++中添加不同大小的双精度矢量

时间:2010-08-31 15:18:21

标签: c++ vector

我有许多不同大小的矢量容器,每个容器都包含双打。 我想添加每个向量的元素来创建一个向量 双打。这个简单的例子将举例说明我所说的:

考虑两个向量A,其中三个元素为3.0 2.0 1.0,B为两个元素 2.0 1.0。我想添加两个向量从最后一个元素开始并工作 向后。这将为数组C提供条目3.0 4.0 2.0。

这样做最优雅/最有效的方法是什么?

谢谢!

3 个答案:

答案 0 :(得分:4)

尝试使用迭代器:

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

答案 1 :(得分:4)

一旦你知道你有一个比另一个更大的载体

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

这很好,因为您不必执行任何循环缩进,并且可以在任何支持反向迭代器的序列容器上工作。

答案 2 :(得分:3)

将较大的矢量复制到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;
}

我没有测试或编译其中任何一个,但我认为你明白了。