0

我有一个代码,我在其中使用两个不同的函数2D3D。在for坐标列表的循环中,我想通过检查来分别调用函数dimensions。然而,检查if每个坐标的尺寸是非常低效的,因为尺寸检查只需要一次(在代码的开头)。

供您参考,2D / 3D functions它们位于单独的文件中,然后坐标列表位于单独的文件中。

任何人都可以通过在代码开头仅使用一次检查来建议一种有效的方法来调用适当的函数dimensions吗?

伪代码:file1.cpp

readcoordinates();  //store the coordinates info;
for(number of coordinates)
   checkfunction(coordinates[i]); //function in file2.cpp

文件2.cpp

checkfunction(coordinates[i]){
   //requires dimension info here for complicated checking,
   // which cannot be explained here.
   // Since entire list of coordinates is same dimension, multiple if checks can be avoided here

}
4

3 回答 3

3

将维数作为模板参数。这允许您避免代码重复,但编译器将摆脱所有尺寸检查,为 2-D 创建一个代码版本和为 3-D 创建一个单独的代码版本,两者都得到充分优化。

您不能在运行时提供模板参数,因此您需要一个调度函数来动态检查维度一次,然后调用 2-D 或 3-D 模板实例。

替代if-elseswitch在调度功能中,是使用虚拟调度(每个虚拟实现然后调用正确的模板实例化来完成实际工作)。

于 2013-10-24T16:53:39.377 回答
1

在大多数情况下,关键是停止通过所有项目的列表访问您的项目。列表不保持顺序,这将您限制在大量检查位置以查看项目是否需要处理。

例如,您可以使用项目树,然后将 X 轴上所需范围内的第一个项目归零,并将该 X 轴上所需范围内的最后一个项目归零,然后处理“介于两者之间”的所有项目。使用这样的解决方案,您可以维护两棵有序的树,一个用于 X 轴,一个用于 Y 轴。

或者,您可以构建基于 Geo-Hashing 技术的数据结构。

在任何一种情况下,您都可以通过坐标快速过滤掉项目,然后将它们传递给不执行任何基于坐标过滤的其他例程(相信来自外部的过滤是正确的)。

于 2013-10-24T16:52:56.360 回答
0

除了其他建议(假设您将这些用于某种 2D 与 3D 数学),您还可以将所有内容视为 3D 向量(2D 向量的 Z 坐标只有 0)。然后你只是实现一个函数,不管你的结构中有多少坐标。

于 2013-10-24T17:07:44.410 回答