Как настроить инвариант шаблонного дерева AVL? - PullRequest
0 голосов
/ 01 октября 2019

Я занимаюсь разработкой общего дерева AVL и хотел бы использовать операторы T и <по умолчанию>, но у меня также есть возможность замены пользовательских, так что я могу иметь больший контроль над инвариантным и свободным T из-за необходимости помещаться внутри моегоbox.

Я не очень знаком с указателями / объектами функций в C ++, где мне искать? станд :: Bind ()? лямбды?

template <typename T>
class avl_tree
{
   private:

   std::shared_ptr<avl_node<T>> root_ {nullptr};

   // > function object? uses T's > by default
   // < function object? uses T's < by default

   public: 

   avl_tree() = default;

   // avl_tree(?, ?) constructor accepting overloads
   //                for the < and > operators
};

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

Вы должны подражать std::set. Возьмите компаратор в качестве аргумента шаблона:

template <typename T, class Compare = std::less<Key>>
class avl_tree
{
private:
    Compare comp;

public:
    avl_tree() = default;
    avl_tree(Compare comp) : comp{comp} {}
}

И сравните с

comp(a, b); // instead of (a < b)
comp(b, a); // instead of (b < a)
0 голосов
/ 05 октября 2019

Я нашел этот ресурс поучительным для тех, кто не знаком с соглашениями о функциональных объектах C ++

https://www.quantstart.com/articles/Function-Objects-Functors-in-C-Part-1

...