我编写了一个函数,该函数首先将两个向量相加(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));
}
我测试过这两者的功能std::transform
,std::max_element
并std::plus<double>
在我的主要环境。一切都按预期进行。我在俯视什么?
您忽略了两件事:第一是未定义的行为!
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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句