当向量的两个元素相乘时,向量c ++与运算符*不匹配

Posted

技术标签:

【中文标题】当向量的两个元素相乘时,向量c ++与运算符*不匹配【英文标题】:Vector c++ no match for operator* when multiplying two elements of a vector 【发布时间】:2020-03-06 11:11:24 【问题描述】:

这是我写的代码的一部分:

for(int i=1;i<=n;i++) a.push_back(i);
while(a.size()!=1)
    b+=a.begin()*a.end()+a.begin()+a.end();
    a.erase(a.begin());
    a.erase(a.end());
    

这是我第一次使用向量,所以我不知道我哪里出错了。 我得到的错误是:

 error: no match for ‘operator*’ (operand types are ‘std::vector::iterator aka __gnu_cxx::__normal_iterator >’ and ‘std::vector::iterator aka __gnu_cxx::__normal_iterator >’)
       b+=a.begin()*a.end()+a.begin()+a.end();
          ~~~~~~~~~^~~~~~~~

【问题讨论】:

begin 返回一个行为类似于指针的迭代器。你能把指针相乘吗? 要从迭代器中获取值,请使用 *itr @MarekR 大概,他想b += &lt;first_element&gt;*&lt;last_element&gt;+&lt;first_element&gt;+&lt;last_element&gt; 是 for 循环中的 while 循环,而您缺少括号吗?如果没有,应删除缩进,以便我们了解您想要实现的目标。 为什么我们在这里使用std::vector?你能显示更多代码吗?在这里使用std::vector 可能有点过分,甚至会降低性能,具体取决于您的代码的使用方式。 【参考方案1】:

begin()end() 返回迭代器。你不能乘以迭代器。使用front()back() 访问第一个和最后一个值。

b += a.front() * a.back() + a.front() + a.back();

【讨论】:

我认为这段代码不是很安全,因为如果你的向量是空的,你的应用程序就会崩溃。您必须测试返回的迭代器是否有效 *a.end() 未定义的行为。 @MarekR 谢谢,完全错过了,现在感觉很愚蠢。【参考方案2】:

看起来你把这段代码复杂化了。你不需要向量来计算这个值。

int f(int n) 
    int r = 0;
    for(int i=1; i <= (n + 1)/2; i++) 
        auto b = i;
        auto e = n + 1 - i;
        r += b * e + b + e;
    
    return r;

【讨论】:

以上是关于当向量的两个元素相乘时,向量c ++与运算符*不匹配的主要内容,如果未能解决你的问题,请参考以下文章

当结构在内部向量中包含各种数量的元素时,如何应用面向数据的设计?

2×3矩阵乘3×2矩阵要怎么算?

二阶矩阵与三阶矩阵相乘的C语言

如何通过C ++中的数据获得向量的索引

R中的元素均值

如何优化 C 代码:寻找下一个设置位并找到相应数组元素的总和