forward_list итераторы несовместимы - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь завершить программу, которая оценивает полиномы при заданном x-значении. Полиномы хранятся с использованием STL's 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 несовместимы изображение всплывающего окна Я почти уверен, что объявил итератор того же типа, что и список, содержащий многочлен, поэтому я не уверен, почему я получаю этоошибка.

Может кто-нибудь объяснить мне, что не так? Заранее спасибо за любую помощь.

Ответы [ 3 ]

4 голосов
/ 13 октября 2019

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());
2 голосов
/ 13 октября 2019

Вы также могли бы использовать std :: аккумулировать , так как это приведет к инициализации с использованием третьего аргумента функции. Кроме того, поскольку нет необходимости объявлять и инициализировать итераторы, нет никакой возможности забыть инициализировать итератор.

Вот пример. Обратите внимание, что нет рукописных циклов:

  #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()); });
  }
1 голос
/ 13 октября 2019

Вы никогда не инициализируете it.

Вы должны были использовать цикл for.

Вы должны были использовать C ++ 11 for(auto it: terms), как мне кажется.

...