forward_list迭代器不兼容

forward_list iterators incompatible

本文关键字:不兼容 迭代器 list forward      更新时间:2023-10-16

我正在尝试完成一个程序,该程序在给定x值时评估多项式。 多项式使用 STL 的forward_list存储在类的对象中。

class PolyTerm {
private:
int _order = 0;
double _coeff = 0.0;
public:
PolyTerm() = default;
PolyTerm(int order, double coefficient) : _order(order), _coeff(coefficient) {}
void setOrder(int order) { _order = order; }
void setCoeff(double coeff) { _coeff = coeff; }
int getOrder() const { return _order; }
double getCoeff() const { return _coeff; }
};

我的函数接受对象和 x 值,编写如下:

double evaluate(const forward_list<PolyTerm>& terms, double x) {
double answer = 0;
forward_list<PolyTerm>::iterator it;
while (it != terms.end()) {
answer += it->getCoeff() * pow(x, it->getOrder());
it++;
}
return answer;
}

我的编译器没有显示任何错误,但是一旦我尝试运行该程序,我就会弹出一个弹出窗口,上面写着"调试断言失败forward_list! 弹出窗口的图像 我很确定我声明了迭代器与保存多项式的列表属于同一类型,所以我不确定为什么会出现此错误。

谁能向我解释出了什么问题? 提前感谢任何帮助。

forward_list<PolyTerm>::iterator it;

它没有初始化。它必须使用转发列表的第一个元素进行初始化。

forward_list<PolyTerm>::iterator it = terms.begin();

你可以简化你的循环,你不会使用it

for (const auto& term : terms)
answer += term.getCoeff() * pow(x, term.getOrder());

你也可以使用 std::accumulate,因为这将使用函数的第三个参数强制初始化。 此外,由于不需要声明和初始化迭代器,因此您不可能忘记初始化迭代器。

下面是一个示例。 请注意,没有手写循环:

#include <numeric>
//...
double evaluate(const forward_list<PolyTerm>& terms, double x) 
{
return std::accumulate(terms.begin(), terms.end(), 0.0, // <-- Note the initial value is 0.0 -- you can't miss it
[&](double total, const PolyTerm& p) 
{ return total + p.getCoeff() * pow(x, p.getOrder()); });
}

你从不初始化it.

您应该使用for循环。

你应该使用C++11for(auto it: terms),因为我认为它会去。