6

KDTree のテンプレート化された実装を作成します。これは今のところ、BarnesHut 実装の Quadtree または Octree としてのみ機能するはずです。

ここで重要な点は設計です。ツリーが定義されている次元の数をテンプレート パラメーターとして指定し、いくつかの一般的なメソッドを宣言するだけで、自動的に正しい方法で動作します (テンプレートの特殊化が必要だと思います)。

2^2 (quadtree) または 2^3 (octree) ノードを持つために、テンプレートを特殊化したいと考えています。

誰かがいくつかのデザインのアイデアを持っていますか? 静的割り当てではなく動的メモリ割り当てを行うように制約されるため、継承を避けたいと思います。

ここで、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?
};

もう 1 つの問題は、quadtree には 4 つのノードがありますが 2 次元であり、octree には 8 つのノードがありますが 3 次元です。つまり、ノードの数は です2^dimension。これをテンプレート メタプログラミングで指定できますか? ループアンローラーが高速になるように、番号 4 と 8 を維持したいと思います。

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

4

2 に答える 2

8

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

于 2012-05-15T11:17:05.770 に答える
2

サポートするC++11コンパイラを使用している場合は、実行時に計算を行うための-versionをconstexpr自分で作成できます。constexprpow

于 2012-05-15T11:14:52.590 に答える