Дерева квадрантов или восьмеричного дерева набора реализации templatized в C++

Я собираюсь написать шаблонную реализацию KDTree, которая пока должна работать только как Quadtree или Octree для реализации BarnesHut.

решающим моментом здесь является дизайн, я хотел бы указать номер измерения, где дерево определяется как параметр шаблона, а затем просто объявить некоторые общие методы, которые автоматически ведут себя правильно (я думаю, что тогда необходима некоторая специализация шаблона).

Я хотел бы специализироваться шаблон для того, чтобы иметь 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?
};

другая проблема заключается в том, что quadtree имеет 4 узла, но 2 измерения, octree имеет 8 узлов, но 3 измерения, т. е. количество узлов 2^dimension. Могу ли я указать это с помощью шаблона-метапрограммирования? Я бы как сохранить число 4 и 8, так что цикл развертки может быть быстрее.

спасибо!

2 ответов


можно использовать 1 << N вместо pow(2, N). Это работает, потому что 1 << N - это константа времени компиляции, тогда как pow(2, N) не является константой времени компиляции (хотя она все равно будет оцениваться во время компиляции).


Если вы используете компилятор C++11, который поддерживает constexpr вы могли бы написать себе constexprверсия pow для выполнения вычисления во время выполнения.