我正在处理一个包含类型(我们说矩形)的库,如下所示:
namespace some_lib{
struct rectangle{
int x;
int y;
int width;
int height;
};
}
我有一个这个矩形的矢量(非常大的矢量可能是10 ^ 9矩形),我想计算这个矩形的区域并在程序的许多地方使用它。
我想要一次计算它。所以我应该把它存放在某个地方。我无法编辑结构。我建议这个解决方案:
namespace my_own_program{
struct rectangle_wrapper{
some_lib::rectangle rect;
int area;
operator some_lib::rectangle() const { return rect; }
};
}
现在我可以将该区域存储在此结构中,如果我想将向量传递给库以对其执行某些处理,我必须在将其复制到另一个向量时进行转换。
我觉得这种方法很垃圾。我解决了计算区域的问题,但每次我需要在库中处理它看起来很可怕。
我的问题:
如何以更好的方式实现这一目标?
答案 0 :(得分:1)
好吧,如果你坚持使用该库并且你必须多次传递矢量,那么我建议创建一个"阴影矢量"它保存索引i处每个矩形i的区域。 这取决于矢量的使用方式。如果你的流失率很高,那么这显然不是你想要的方法,但是你不应该首先使用矢量。
您可以将两个向量包装在代码中使用的自定义类中,以访问矩形并将向量传递给库。
答案 1 :(得分:0)
我更喜欢另一种解决方案:
struct rectangle{
int x;
int y;
int width;
int height;
};
struct extended_rectangle : public rectangle {
int area;
};
在这种情况下,您可以将extended_rectangle传递给任何期望矩形类型的函数(可能作为参考传递)
更新:在阅读Aconcagua的评论之后,更准确一点:
如果你想调用第三个函数作为参数接收一个向量 - 一个连续的内存块 - 与对象序列(即作为一个c向量)你没有解决方案,正如Aconcagua指出的那样(谢谢你,阿空加瓜,我没想过那个细节。)
但是,如果你选择了不能作为连续对象参数传递的rectangle_wrapper,我更喜欢我的extended_rectangle解决方案。
如果您希望对象位于向量中,您可以使用基于对象指针向量的任何解决方案,以便利用多态性(您可以将* v [i]作为矩形处理)。