我正在编写一个模板Polynom<T>
类,其中T
是其系数的数字类型。
多项式的系数存储在 中std::vector<T> coefficients
,其中coefficients[i]
对应x^i
于实数多项式。(所以 x 的幂是递增的)。
保证coefficients
向量始终包含至少一个元素。- 对于零多项式,它是T()
。
我想重载operator[]
执行以下操作:
- 传递给 operator[] 的索引对应于我们要修改/读取其系数的 X 的幂。
- 如果用户只想读取系数,它应该抛出负索引,返回
coefficients.at(i)
存储范围内的索引 - 并合理地为所有其他索引返回 0,而不是抛出。 - 如果用户想修改系数,它应该抛出负指数,但让用户自由修改所有其他指数,即使指定的指数大于或等于
coefficients.size()
。所以我们想以某种方式调整向量的大小。
我遇到的主要问题如下:
1.
如何区分读情况和写情况?一个人没有解释就离开了我,但说写了两个版本:
const T& operator[] (int index) const;
T& operator[] (int index);
是不够的。但是,我认为编译器在读取情况下更喜欢 const 版本,不是吗?
2.
我想确保coefficients
向量中不会存储任何尾随零。所以我必须提前知道,“在”我返回一个可变T&
的系数之前,用户想要分配什么值。而且我知道这operator[]
不会收到第二个论点。
显然,如果这个值不为零(不是 T()),那么我必须调整向量的大小并将适当的系数设置为传递的值。
但我不能提前(在返回T&
from之前operator[]
)这样做,因为如果要分配的值是 T(),那么,如果我提前调整系数向量的大小,它最终会有很多尾随“零”。
当然,我可以检查类的每个其他函数中的尾随零,并在这种情况下删除它们。对我来说似乎是一个非常奇怪的决定,我希望每个函数都开始工作,假设如果向量的大小 > 1,则向量末尾没有零。
你能否建议我尽可能具体地解决这个问题?我听说过编写一个可隐式转换为T&
with 重载的内部类operator=
,但我缺乏细节。
非常感谢您!