首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模板Polynom类的重载operator[]

模板Polynom类的重载operator[]
EN

Stack Overflow用户
提问于 2011-11-09 09:20:04
回答 5查看 1.6K关注 0票数 3

我正在编写一个模板Polynom<T>类,其中T是其系数的数值类型。

多边形的系数存储在std::vector<T> coefficients中,其中coefficients[i]对应于实多边形中的x^i。(因此x的幂在增加)。

保证coefficients向量始终包含至少一个元素。-对于零倍数,它是T()

我想使operator[]过载以执行以下操作:

  1. 传递给operator[]的索引对应于X的幂,我们希望修改/读取它的系数。
  2. 如果用户只想读取系数,它应该抛出负索引,对存储范围内的索引返回coefficients.at(i),对于所有其他索引,合理地返回0,而不是抛出。H 217H 118如果用户想要修改E 119修改E 220系数,它应该抛出负性索引,但允许用户自由修改所有其他索引,即使指定的索引大于或等于<>D21代码。因此,我们想以某种方式调整向量的大小。

我遇到的主要问题如下:

1.

如何区分读大小写和写大小写?有一个人没有给我解释,而是说写了两个版本:

代码语言:javascript
复制
const T& operator[] (int index) const;
T& operator[] (int index);

还不够。但是,我认为编译器会更喜欢read情况下的const版本,不是吗?

2.

我想确保没有尾随零存储在coefficients向量中。因此,我必须事先知道,“之前”我返回一个可变的T&,我的系数,用户想要分配的值。我知道operator[]没有收到第二个论点。

显然,如果这个值不是零(不是T()),那么我必须调整向量的大小,并将适当的系数设置为传递的值。

但是我不能提前完成(在从T&返回operator[]之前),因为如果要赋值的值是T(),那么,只要我提前调整系数向量的大小,它最终就会有大量的尾随“零”。

当然,我可以在类的所有其他函数中检查尾随零,并在这种情况下删除它们。在我看来,这似乎是一个非常奇怪的决定,我希望每个函数都能开始工作,假设向量的末尾没有零,如果它的大小大于1时。

你能给我建议一下这个问题的具体解决办法吗?我听说了一些关于使用重载的T&隐式可转换为operator=的内部类,但我缺乏细节。

非常感谢您提前!

EN

Stack Overflow用户

发布于 2011-11-09 09:34:47

我看到了两种解决你问题的方法:

  1. 没有将系数存储在std::vector<T>中,而是将它们存储在std::map<unsigned int, T>中。这样,您将永远只存储非零系数。您可以创建自己的std::map-based容器,该容器将消耗存储在其中的零。这样,您还可以为x^n形式的多项式节省一些存储空间。
  2. 添加了一个内部类,该类将存储索引(幂)和系数值。您将从operator[]返回对该内部类实例的引用。内部类将覆盖operator=。在重写的coefficients.

中,您将获取存储在内部类实例中的索引(power)和系数,并将它们刷新到存储operator=std::vector中。

票数 1
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8062731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档