我正在编写一个模板Polynom<T>类,其中T是其系数的数值类型。
多边形的系数存储在std::vector<T> coefficients中,其中coefficients[i]对应于实多边形中的x^i。(因此x的幂在增加)。
保证coefficients向量始终包含至少一个元素。-对于零倍数,它是T()。
我想使operator[]过载以执行以下操作:
coefficients.at(i),对于所有其他索引,合理地返回0,而不是抛出。H 217H 118如果用户想要修改E 119修改E 220系数,它应该抛出负性索引,但允许用户自由修改所有其他索引,即使指定的索引大于或等于<>D21代码。因此,我们想以某种方式调整向量的大小。我遇到的主要问题如下:
1.
如何区分读大小写和写大小写?有一个人没有给我解释,而是说写了两个版本:
const T& operator[] (int index) const;
T& operator[] (int index);还不够。但是,我认为编译器会更喜欢read情况下的const版本,不是吗?
2.
我想确保没有尾随零存储在coefficients向量中。因此,我必须事先知道,“之前”我返回一个可变的T&,我的系数,用户想要分配的值。我知道operator[]没有收到第二个论点。
显然,如果这个值不是零(不是T()),那么我必须调整向量的大小,并将适当的系数设置为传递的值。
但是我不能提前完成(在从T&返回operator[]之前),因为如果要赋值的值是T(),那么,只要我提前调整系数向量的大小,它最终就会有大量的尾随“零”。
当然,我可以在类的所有其他函数中检查尾随零,并在这种情况下删除它们。在我看来,这似乎是一个非常奇怪的决定,我希望每个函数都能开始工作,假设向量的末尾没有零,如果它的大小大于1时。
你能给我建议一下这个问题的具体解决办法吗?我听说了一些关于使用重载的T&隐式可转换为operator=的内部类,但我缺乏细节。
非常感谢您提前!
发布于 2011-11-09 09:34:47
我看到了两种解决你问题的方法:
std::vector<T>中,而是将它们存储在std::map<unsigned int, T>中。这样,您将永远只存储非零系数。您可以创建自己的std::map-based容器,该容器将消耗存储在其中的零。这样,您还可以为x^n形式的多项式节省一些存储空间。operator[]返回对该内部类实例的引用。内部类将覆盖operator=。在重写的coefficients.中,您将获取存储在内部类实例中的索引(power)和系数,并将它们刷新到存储operator=的std::vector中。
https://stackoverflow.com/questions/8062731
复制相似问题