我正在尝试使用运算符重载来定义我的多项式类的基本运算(+, - ,*,/)但是当我运行程序时它会崩溃并且我的计算机冻结。
UPDATE4
确定。我成功完成了三项操作,剩下的只剩下一部分。
这是我得到的:
polinom operator*(const polinom& P) const
{
polinom Result;
constIter i, j, lastItem = Result.poly.end();
Iter it1, it2, first, last;
int nr_matches;
for (i = poly.begin() ; i != poly.end(); i++) {
for (j = P.poly.begin(); j != P.poly.end(); j++)
Result.insert(i->coef * j->coef, i->pow + j->pow);
}
Result.poly.sort(SortDescending());
lastItem--;
while (true) {
nr_matches = 0;
for (it1 = Result.poly.begin(); it1 != lastItem; it1++) {
first = it1;
last = it1;
first++;
for (it2 = first; it2 != Result.poly.end(); it2++) {
if (it2->pow == it1->pow) {
it1->coef += it2->coef;
nr_matches++;
}
}
nr_matches++;
do {
last++;
nr_matches--;
} while (nr_matches != 0);
Result.poly.erase(first, last);
}
if (nr_matches == 0)
break;
}
return Result;
}
答案 0 :(得分:5)
while (i != poly.end() || P.i != P.End())
我认为你需要&&在那里,否则只有当i和p.i同时到达各自的末尾时,循环才会终止。
否定的逻辑是棘手的。可能更容易将其视为:
while (!(i == poly.end() || j == P.End())) //while neither iterator has reached end
根据布尔算法与:
相同while (!(i == poly.end()) && !(j == P.End()))
while (i != poly.end() && j != P.End())
如果两者都相等,你也似乎没有递增迭代器(无限循环导致无限多的内存分配?)。
样式问题:最好使用迭代器作为局部变量。如果在开始在方法中使用它们之前它们应该被“初始化”,则不要使变量类成员,并且在方法完成后它们变得无用。
也更喜欢通过const引用传递参数,如果它们不修改当前对象,则标记成员函数 const (operator+
不应该):
polinom operator+(const polinom& P) const;
(这将揭示制作本地使用的迭代器成员的问题 - 您将修改实例!)
答案 1 :(得分:2)
您的代码还存在其他设计和正确性问题,但我认为崩溃发生在此行
if (i->pow > P.i->pow)
当i == poly.end()&& P.i!= P.End()或i!= poly.end()&& P.i == P.End()。在最后一个元素崩溃后指向i时,取消引用它。
答案 2 :(得分:1)
关于正确添加多项式的函数,我建议使用这个简单的逻辑:
polinom operator+(const polinom& P) const //fixed prototype re. const-correctness
{
polinom Result;
std::list<term>::const_iterator //fixed iterator type
i = poly.begin(), j = P.poly.begin();
while (i != poly.end() && j != P.poly.end()) {
//logic while both iterators are valid
}
//handle the remaining items in each list
//note: at least one will be equal to end(), but that loop will simply be skipped
while (i != poly.end()) {
Result.insert(i->coef, i->pow);
++i;
}
while (j != P.poly.end()) {
Result.insert(j->coef, j->pow);
++j;
}
return Result;
}
最后一部分也可能留给标准库函数
#include <iterator>
#include <algorithm>
//...
//handle remaining items in either list (if any)
std::copy(i, poly.end(), std::back_inserter(Result.poly));
std::copy(j, P.poly.end(), std::back_inserter(Result.poly));
...但使用list.insert可能会更简单:
Result.poly.insert(Result.poly.end(), i, poly.end());
Result.poly.insert(Result.poly.end(), j, P.poly.end());