Дерева квадрантов или восьмеричного дерева набора реализации 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
для выполнения вычисления во время выполнения.