Как я могу реализовать конструктор и деструктор этого класса шаблона набора? - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь реализовать заданный шаблонный класс, используя структуру B-дерева (сбалансированное дерево). Закрытые члены: '' 'data [MAXIMUM + 1]' '' содержит элементы текущего узла в дереве. '' 'set * subset [MAXIMUM + 2]' '' содержит указатели на дочерние элементы текущего набора, которые также имеют тип set. Я пытаюсь реализовать конструктор по умолчанию, который должен создать пустой набор и деструктор, который использует функцию очистки для очистки набора. Однако я не понимаю, что должен инициализировать конструктор и что освободит деструктор. Это код из текста: структуры данных -Main, Savitch 4th edition- ch12, где Savitch объясняет B-деревья, выполняя реализацию этого набора шаблонов. Однако он не go через реализацию конструктора и деструктора.

Вот код:

template <class Item>
class set
{
public:
    // TYPEDEFS
    typedef Item value_type;
    // CONSTRUCTORS and DESTRUCTOR
    set();
    set(const set& source);
    ~set() { clear(); }
    // MODIFICATION MEMBER FUNCTIONS
    void operator =(const set& source);
    void clear();
    bool insert(const Item& entry);
    std::size_t erase(const Item& target);
    // CONSTANT MEMBER FUNCTIONS
    std::size_t count(const Item& target) const;
    bool empty() const { return (data_count == 0); }
    // SUGGESTED FUNCTION FOR DEBUGGING
    void print(int indent) const;
private:
    // MEMBER CONSTANTS
    static const std::size_t MINIMUM = 200;
    static const std::size_t MAXIMUM = 2 * MINIMUM;
    // MEMBER VARIABLES
    std::size_t data_count;
    Item data[MAXIMUM + 1];
    std::size_t child_count;
    set* subset[MAXIMUM + 2];
    // HELPER MEMBER FUNCTIONS
    bool is_leaf() const { return (child_count == 0); }
    bool loose_insert(const Item& entry);
    bool loose_erase(const Item& target);
    void remove_biggest(Item& removed_entry);
    void fix_excess(std::size_t i);
    void fix_shortage(std::size_t i);

1 Ответ

0 голосов
/ 19 апреля 2020

Если я правильно понимаю ваш разум, child_count - это количество допустимых записей в массиве subset. Если это так, инициализируйте его в ноль в конструкторе по умолчанию. Деструктору потребуется delete первых child_count элементов subset.

Для данных, опять же, если я вас правильно понимаю, data_count - это число действительных записей в data массив. Если это так, вам нужно инициализировать его тоже 0. Но поскольку элементы data являются значениями, а не указателями, они инициализируются в конструкторе и автоматически завершаются в деструкторе.

Часто лучше использовать необработанное хранилище со всеми механизмами размещения, чтобы предотвратить создание MAXIMUM + 1 элементов даже для пустого узла, а также допускается Item s без конструктора по умолчанию, но это требует большой осторожности, чтобы не столкнуться с UB.

...