当向量的两个元素相乘时,向量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 += <first_element>*<last_element>+<first_element>+<last_element>
是 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 ++与运算符*不匹配的主要内容,如果未能解决你的问题,请参考以下文章