Ваша add()
функция выглядит правильно, кроме печати:
for(i=terms.end(); i!=terms.begin(); i--)
{
test << "Coefficient: " << i->first << " ";
test << "Exp: " << i->second << endl;
}
Это совершенно неправильно и вызывает неопределенное поведение. i
изначально terms.end()
и вы разыменовываете его? items.end()
возвращает устаревший итератор. Даже если я некоторое время предполагаю, что это правильно, условие i!=terms.begin()
означает, что первый элемент никогда не печатается!
Итак, исправление таково:
for(list<pair<double,int> >::iterator i=terms.begin(); i!=terms.end(); i++)
{
test << "Coefficient: " << i->first << " ";
test << "Exp: " << i->second << endl;
}
И выводит ожидаемый результат:
Size: 4
Coefficient: -2 Exp: 4
Coefficient: -11 Exp: 5
Coefficient: 3 Exp: 6
Coefficient: -2 Exp: 7
Разве это не правильно?
См. Также вывод здесь: http://www.ideone.com/p8mwJ
Кстати, вместо add
вы могли бы сделать это operator+=
вместо этого, как:
const Polynomial& operator+=(const Polynomial& rhs)
{
//same code as before
return *this;
}
Если вы напишите так, то вы можете добавить полиномы как:
Polynomial p(pair<double, int>(-10, 5));
p += Polynomial(pair<double,int> (-2,4));
p += Polynomial(pair<double,int> (3,6));
p += Polynomial(pair<double,int> (-2,7));
p += Polynomial(pair<double, int> (-1,5));
Демо: http://www.ideone.com/aA1zF
Я только что прочитал ваш комментарий и узнал, что вы хотите напечатать его в обратном порядке, в этом случае вы можете использовать rbegin()
и rend()
вместо begin()
и end()
как:
for(list<pair<double,int> >::const_reverse_iterator i=terms.rbegin();
i!=terms.rend();
i++)
{
test << "Coefficient: " << i->first << " ";
test << "Exp: " << i->second << endl;
}
Я бы также посоветовал вам сделать print
постоянной функцией как:
void print() const
//^^^^ this makes the function const!
Еще лучше, перегрузка operator<<
.
В любом случае демонстрация печати в обратном порядке: http://www.ideone.com/Vk6XB