QuadTree或Octree模板化的C ++实现

时间:2012-05-15 11:01:29

标签: c++ template-meta-programming quadtree kdtree octree

我将编写一个KDTree的模板化实现,现在它只能作为Quadtree或八叉树用于BarnesHut实现。

这里的关键点是设计,我想指定树被定义为模板参数的维数,然后简单地声明一些常用方法,这些方法自动表现正确(我认为需要一些模板专业化)然后)。

我想专门化模板,以便拥有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,这样循环展开器可以更快。

谢谢!

2 个答案:

答案 0 :(得分:8)

您可以使用1 << N代替pow(2, N)。这是因为1 << N是编译时常量,而pow(2, N)不是编译时常量(即使它将在编译时进行评估)。

答案 1 :(得分:2)

如果您使用的是支持constexpr的C ++ 11编译器,您可以自己编写constexprpow来在运行时进行计算。