返回最多(两个)元素添加的向量

时间:2015-04-17 16:34:08

标签: c++ stdvector

我编写了一个函数,首先添加两个向量(v1b1添加到vsum),然后返回vsum的最大值。这是我试图运行的,它不能用于某种原因:

double MaximumOfSummedVectors(std::vector<double> &v1,std::vector<double> &v2) {
    std::vector<double> vsum;
    std::transform(v1.begin(),v1.end(),v2.begin(),vsum.begin(),std::plus<double>());
    return *std::max_element(std::begin(vsum),std::end(vsum));
}

我在主要环境中测试了std::transformstd::max_elementstd::plus<double>的功能。一切都按预期工作。我在俯瞰什么?

2 个答案:

答案 0 :(得分:0)

你忽略了两件事:第一件事是未定义的行为!

std::vector<double> vsum;
此时

vsum的大小为零。但是transform只会写入你传入的迭代器

  

效果:通过[result,result + (last1 - first1))范围内的每个迭代器i分配一个等于...的新对应值

但该范围尚未初始化 - 因此您将要写入未初始化的内存!你需要做任何一件事:

vsum.resize(v1.size());

或传递插入器:

std::transform(v1.begin(),v1.end(),v2.begin(),
     std::back_inserter(vsum),
     std::plus<double>());

第二件事是,您不会出于某种原因构建这个全新的向量:

double MaximumOfSummedVectors(std::vector<double> &v1,std::vector<double> &v2) 
{
     auto i1 = v1.begin(), i2 = v2.begin();
     double m = *i1++ + *i2++;
     for (; i1 != v1.end(); ++i1, ++i2) {
         m = std::max(m, *i1 + *i2);
     }
     return m;
}

答案 1 :(得分:0)

您传递vsum.begin()作为输出参数。这假设向量中有足够的空间来写输出序列,而实际上向量是空的;所以输出会从向量的末尾写入未定义的区域。

相反,您希望使用插入转换器std::back_inserter(vsum)将输出值插入到矢量中。