0

と に 2 つの異なる関数を使用するコードが2Dあり3Dます。座標のリストのforループで、 をチェックしてそれぞれ関数を呼び出したいと思いますdimensions。ただし、ifすべての座標に対して を使用して次元をチェックするのは非常に非効率的です。これは、次元チェックが (コードの最初で) 1 回しか必要とされないためです。

参考までに、2D / 3D functions座標は別のファイルにあり、座標のリストは別のファイルにあります。

のコードの先頭で 1 つのチェックのみを使用して、適切な関数を呼び出す効率的な方法を誰かが提案できます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

}
4

3 に答える 3

3

Make the number of dimensions a template parameter. This allows you to avoid code duplication, but the compiler will get rid of ALL the dimension checks, creating a version of the code for 2-D and a separate one for 3-D, both getting fully optimized.

You can't provide template parameters at runtime, so then you need a dispatch function that dynamically checks the dimension, once, and calls either the 2-D or 3-D template instance.

An alternative to if-else or switch in the dispatch function, is to use virtual dispatch (each virtual implementation then calls the right template instantiation to do the actual work).

于 2013-10-24T16:53:39.377 に答える
1

このようなほとんどの状況では、すべてのアイテムのリストを介してアイテムにアクセスするのをやめることが重要です。リストは順序を維持しないため、アイテムを処理する必要があるかどうかを確認するために多くの場所を確認する必要があります。

たとえば、アイテムのツリーを使用して、X 軸の目的の範囲内の最初のアイテムと、その X 軸の目的の範囲内の最後のアイテムにゼロを設定し、「間にある」すべてのアイテムを処理できます。このようなソリューションを使用すると、X 軸用と Y 軸用の 2 つの順序付けられたツリーを維持できます。

または、Geo-Hashing 手法に基づいてデータ構造を構築することもできます。

いずれの場合も、アイテムを座標ですばやくフィルター処理してから、座標ベースのフィルター処理を行わない他のルーチンにそれらを渡すことができます (外部からのフィルター処理が正しいことを信頼します)。

于 2013-10-24T16:52:56.360 に答える
0

他の提案に加えて (これらをある種の 2D 対 3D 数学に使用していると仮定して)、すべてを 3D ベクトルとして扱うこともできます (2D ベクトルの Z 座標は 0 になります)。次に、構造内の座標の数に関係なく、単一の関数を実装しています。

于 2013-10-24T17:07:44.410 に答える