需要有关算法的建议

时间:2013-10-24 16:46:14

标签: c++ c algorithm if-statement

我有一个代码,我为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

file2.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

}

3 个答案:

答案 0 :(得分:3)

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

您无法在运行时提供模板参数,因此您需要一次动态检查维度的调度函数,并调用二维或三维模板实例。

调度函数中if - elseswitch的替代方法是使用虚拟调度(每个虚拟实现然后调用正确的模板实例来完成实际工作)。

答案 1 :(得分:1)

在大多数情况下,关键是要停止通过所有项目列表访问您的项目。列表不维护订单,这限制了您到很多检查位置以查看项目是否需要处理。

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

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

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

答案 2 :(得分:0)

除了其他建议(假设您正在使用这些建议进行某种2D与3D数学运算),您还可以将所有内容视为3D矢量(2D矢量只有0为Z坐标) )。然后,您只需实现一个函数,无论您的结构中有多少坐标。