【发布时间】:2020-08-01 15:24:59
【问题描述】:
我正在尝试使用 B 树(平衡树)结构实现一个集合模板类。 私有成员:'''data[MAXIMUM + 1]''' 具有树中当前节点的元素。 '''set* subset[MAXIMUM + 2]''' 具有指向当前集合的孩子的指针,这些孩子也是集合类型。 我正在尝试实现默认构造函数,它应该创建一个空集和一个使用函数 clear 清空集合的析构函数。但是,我不明白构造函数应该初始化什么以及析构函数会释放什么。这是文本中的代码:数据结构-Main,Savitch 4th edition-ch12,其中 Savitch 通过执行此模板集来解释 B 树。但是,他并没有经历构造函数和析构函数的实现。
代码如下:
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);
【问题讨论】:
-
析构函数应该释放所有东西。所以如果
insert分配了一些东西,那么析构函数也应该释放它。我会猜测析构函数应该通过子集数组删除那里的所有内容。但是,也许您会感到困惑,因为恕我直言,这是糟糕的类设计。它混淆了集合(这是一棵树)与构成树的节点。这里的set类扮演了这两个角色。 -
默认构造函数应该创建一个空集(即包含 0 个项目的集)。析构函数已经在 set 类中实现了。
-
subset对于 B 树中的子数组来说不是一个好名字。非常混乱。children怎么样? -
@john。我知道析构函数应该删除指向成员“子集”中集合的指针。但是,对于一个空集,构造函数应该为子集元素分配什么?因为如果什么都没有分配,那么 clear() 会释放什么?
-
好吧,我看不到您现有的实现,但我想
data_count会告诉您有多少个子集。如果您有 N 个数据项,则您有 N + 1 个子集。空集是一种特殊情况,但是如果您将data_count设置为零并将subsets[0]设置为nullptr,那么我看不出有任何问题。但正如我所说,我看不到你现有的实现,所以我不能确定你应该如何完成它。
标签: c++ constructor set destructor b-tree