元素智能矢量乘法c ++(代码不工作)

时间:2017-02-16 15:59:21

标签: c++ vector

我无法理解为什么我的代码不起作用。 我有两个向量,我希望用我的第二个向量替换每个元素的乘积(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

3 个答案:

答案 0 :(得分:6)

错误很明显:std::transform returns an iterator,你返回的是vector<float>,它不能由单个迭代器隐式构造。

此外,您尝试调用的std::transform超载不正确,因为它接受UnaryOperationstd::multipliesBinaryOperation。你需要这个重载:

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;
}

coliru example

用法示例:

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()

Click here for a working example

答案 2 :(得分:0)

从编译器的错误消息中可以明显看出这个问题。 std :: transform的返回类型是迭代器,而不是容器。 电话  std :: transform(v1.begin(),v1.end(),v2.begin(),std :: multiplies&lt; float&gt;()); 更新v2,使其元素包含逐元素乘法的结果。 您可以将函数的返回值更改为void: void vectorMultiplication(vector&lt; float&gt;&amp; v1,vector&lt; float&gt;&amp; v2) {    std :: transform(v1.begin(),v1.end(),v2.begin(),std :: multiplies&lt; float&gt;()); } 或者返回v2: 向量&lt; float&gt; vectorMultiplication(vector&lt; float&gt;&amp; v1,vector&lt; float&gt;&amp; v2) {    std :: transform(v1.begin(),v1.end(),v2.begin(),std :: multiplies&lt; float&gt;());    返回v2; }