簡體   English   中英

forward_list 迭代器不兼容

[英]forward_list iterators incompatible

我正在嘗試完成一個在給定 x 值時評估多項式的程序。 多項式使用 STL 的 forward_list 存儲在 class 的對象中。

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

我的 function 采用 object 和 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 ,因為這將使用 function 的第三個參數強制初始化。 此外,由於不需要聲明和初始化迭代器,因此您不會忘記初始化迭代器。

這是一個例子。 請注意,沒有手寫循環:

  #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++11 for(auto it: terms) ,因為我認為它會 go。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM