Return(两个)逐元素相加向量的最大值
Return the maximum of (two) element-wise added vectors
我写了一个函数,首先添加两个向量(v1
和 b1
被添加到 vsum
)并且比 returns 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
只会写入您传入的迭代器
Effects: Assigns through every iterator i in the range [result,result + (last1 - first1))
a new corresponding value equal to ...
但该范围未初始化 - 因此您将写入未初始化的内存!您需要执行以下任一操作:
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;
}
您将 vsum.begin()
作为输出参数传递。这假设向量中有足够的 space 来写入输出序列,而实际上向量是空的;所以输出从向量的末尾注销到未定义的区域。
相反,您想使用插入插入器将输出值插入向量中 std::back_inserter(vsum)
。
我写了一个函数,首先添加两个向量(v1
和 b1
被添加到 vsum
)并且比 returns 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
只会写入您传入的迭代器
Effects: Assigns through every iterator i in the range
[result,result + (last1 - first1))
a new corresponding value equal to ...
但该范围未初始化 - 因此您将写入未初始化的内存!您需要执行以下任一操作:
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;
}
您将 vsum.begin()
作为输出参数传递。这假设向量中有足够的 space 来写入输出序列,而实际上向量是空的;所以输出从向量的末尾注销到未定义的区域。
相反,您想使用插入插入器将输出值插入向量中 std::back_inserter(vsum)
。