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()作为输出参数传递。这假设向量中有足够的空间来写入输出序列,而实际上向量是空的;因此,输出被从向量的末尾写到未定义的区域
相反,您希望使用插入interatorstd::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;
}