我无法理解为什么我的代码不起作用。
我有两个向量,我希望用我的第二个向量替换每个元素的乘积(v2[0] = v1[0] * v2[0]
,v2[1] = v1[1] * v2[1]
等等......)
码
vector <float> vectorMultiplication(vector <float> &v1, vector <float> &v2)
{
return std::transform(v1.begin(), v1.end(), v2.begin(), std::multiplies<float>() );
}
如果有人能指出我的错误,我将非常感激。
P.S。我的编译器抛出的错误消息是:
error: conversion from ‘__gnu_cxx::__normal_iterator<float*, std::vector<float> >’ to non-scalar type ‘std::vector<float>’ requested
附: 2我正在运行C ++ 98
答案 0 :(得分:6)
错误很明显:std::transform
returns an iterator,你返回的是vector<float>
,它不能由单个迭代器隐式构造。
此外,您尝试调用的std::transform
超载不正确,因为它接受UnaryOperation
而std::multiplies
是BinaryOperation
。你需要这个重载:
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation >
OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2,
OutputIt d_first, BinaryOperation binary_op );
以下代码将编译并运行:
auto vectorMultiplication(const std::vector<float>& v1, const std::vector<float>& v2)
{
std::vector<float> result;
std::transform(v1.begin(), v1.end(), v2.begin(),
std::back_inserter(result), std::multiplies<float>());
return result;
}
用法示例:
std::vector<float> v1 = {1, 2, 3, 4};
std::vector<float> v2 = {1, 2, 3, 4};
auto vm = vectorMultiplication(v1, v2);
for(const auto& x : vm) std::cout << x << " ";
将打印:
1 4 9 16
答案 1 :(得分:0)
错误是return std::transform(...);
尝试返回结果输出迭代器,但声明函数返回vector<float>
。你需要弄清楚你真正想要回归的东西,因为这里并不是很清楚。可能只是void
,并完全删除return
关键字?
但实际上您希望将函数同时应用于v1
的元素和v2
的元素。您尝试使用的transform
形式不会这样做。还有另一种形式,但这里有点令人困惑:
std::transform(v1.begin(), // start of first input range
v1.end(), // end of first input range
v2.begin(), // start of **second input** range
v2.begin(), // start of **output** range
std::multiplies<float>());
请参阅version 3 here。
为此,您需要确保v1.size() <= v2.size()
。
答案 2 :(得分:0)