2012-05-15 14 views
6

私はKDTreeのテンプレート化された実装を書くつもりですが、今はBarnesHut実装ではQuadtreeまたはOctreeとしてしか動作しません。QuadTreeまたはOctree C言語でのテンプレート化された実装

ここで重要な点はデザインですが、ツリーがテンプレートパラメータとして定義されているディメンションの数を指定し、いくつかの一般的なメソッドを宣言して、正しい方法で自動的に動作するようにしたいと考えています。その後必要)。

2^2(クォードツリー)または2^3(オクトリー)ノードを持つためにテンプレートを特化したいと思います。

デザインアイデアはありますか?静的な割り当てではなく動的なメモリ割り当てを行うことを制限しているため、継承は避けたいと思います。

ここでNは2又は3

template<int N> 
class NTree 
{ 
public: 
    NTree<N>(const std::vector<Mass *> &); 
    ~NTree<N>() 
    { 
     for (int i=0; i<pow(2,N); i++) 
      delete nodes[i]; 
    } 
private: 
    void insert<N>(Mass *m); 
    NTree *nodes[pow(2,N)]; // is it possible in a templatized way? 
}; 

することができる別の問題は、四分木は、4つのノードが、2次元を有することで、オクツリーは、8つのノードが、3次元を有し、すなわち、ノードの数が2^dimensionあります。テンプレートメタプログラミングでこれを指定できますか?ループアンローラーがより速くなるように、私は4番と8番のままにしておきたいと思います。

ありがとうございました!

+1

「リーフ」という用語を誤って使用していますが、正しい用語は「ノード」です。 「リーフ」は、子なしのノードです。 –

+0

kdtreesとquad/octreeも混在していますが、それらは同じではありません(つまり、2Dツリーはクォッドツリーと等しくありません)。 – KillianDS

+0

右のように、2Dツリーのquadtreeのように動作するn-aryツリーが必要です3Dでオクトリー、私は質問を編集しています。 – linello

答えて

8

pow(2, N)の代わりに1 << Nを使用できます。これは、はコンパイル時定数ではありませんが(たとえコンパイル時に評価されても)、1 << Nがコンパイル時定数であるために機能します。

+0

いいアイデア!ありがとうございました!あなたはまた、この種のテンプレート化された実装が実現可能か良いと思いますか? – linello

+0

いいえ。テンプレートコードは、1つのクアッドツリーと1つのオクトリーの2つの別々の実装よりも読み書きが難しいと思います。 1次元データに特化したデータ構造が優れているのでN = 2に遭遇することはまずありません.N> 3は各ノードのサイズの指数関数的増加のために起こりそうもありません。 –

+0

あなたは正しいですが、ベクトル化と行列演算(固有)のためにテンプレート化された線形代数ライブラリも使用していますが、N == 2かN == 3かどうかをチェックして、 。私はメンテナンスの目的で2つの実装に加わりたいと思っていました。新しい情報が入り次第お知らせします – linello

2

constexprをサポートするC++ 11コンパイラを使用している場合は、実行時にpowconstexpr -versionを書くことができます。

+0

残念ながら私はそのようなコンパイラを持つことはできませんし、C++ 11のいくつかの機能はまだわかりません。P – linello

+1

これはC++でも同様です。積分力に対する単純な再帰的テンプレートメタ関数は、実際に作るのが簡単です。ベースが常に2の場合、Dietrich Eppが示唆しているように、ビットシフトではるかに優れています。 – Fiktik

関連する問題