Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回最多(两)个按元素添加的向量_C++_Stdvector - Fatal编程技术网

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

C++ 返回最多(两)个按元素添加的向量,c++,stdvector,C++,Stdvector,我编写了一个函数,首先添加两个向量(v1和b1添加到vsum),然后返回vsum的最大值。以下是我尝试运行的程序,由于某些原因无法运行: double MaximumOfSummedVectors(std::vector<double> &v1,std::vector<double> &v2) { std::vector<double> vsum; std::transform(v1.begin(),v1.end(),v2.be

我编写了一个函数,首先添加两个向量(
v1
b1
添加到
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));
}
总和向量的双倍最大值(标准::向量和v1,标准::向量和v2){ std::向量vsum; std::transform(v1.begin()、v1.end()、v2.begin()、vsum.begin()、std::plus()); 返回*std::max_元素(std::begin(vsum),std::end(vsum)); }
我已经在我的主环境中测试了
std::transform
std::max_元素
std::plus
的功能。一切如期进行。我忽略了什么?

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

std::vector<double> vsum;
或通过插入器:

std::transform(v1.begin(),v1.end(),v2.begin(),
     std::back_inserter(vsum),
     std::plus<double>());
std::transform(v1.begin(),v1.end(),v2.begin(),
标准:背面插入器(vsum),
std::plus());
第二件事是你在构建这个全新的向量,几乎没有理由:

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;
}
总和向量的双倍最大值(标准::向量和v1,标准::向量和v2) { 自动i1=v1.begin(),i2=v2.begin(); 双m=*i1++*i2++; 对于(;i1!=v1.end();++i1,++i2){ m=标准::最大值(m,*i1+*i2); } 返回m; } 将
vsum.begin()作为输出参数传递。这假设向量中有足够的空间来写入输出序列,而实际上向量是空的;因此,输出被从向量的末尾写到未定义的区域


相反,您希望使用插入interator
std::back_inserter(vsum)

使用
std::valarray
将输出值插入向量,然后您可以执行
(v1+b1+vsum).max()
FWIW,Boost有一个zip迭代器,所以你可以用一行
max_元素
调用,或者用几行来创建开始和结束变量。谢谢你的深入回答!
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;
}