【发布时间】:2020-08-04 07:17:25
【问题描述】:
我需要在我的代码的关键部分创建一个多树。标准方法是使用类似的东西:
struct node{ // or class
... data ...
std::unordered_set<node*> children
};
node* root;
重要的一点是,一旦创建了一个节点,在整个树被删除之前,on 不会被删除。
显而易见的方法是使用 new 和 delete 语句来管理堆上的这些数据。完成。
我想知道是否值得探索直接使用 std::vector 而不是 new/delete 的性能:
struct node{ // or class
... data ...
std::unordered_set<uint_32> children
};
std::vector<node> tree;
uint_32 root; // probably always 0, fist element of vector
删除树只需使用tree.clear();
对于大(或巨大的)树有没有可能更快?
【问题讨论】:
-
为什么使用原始指针?
std::unordered_set<str::unique_ptr<node>> children和删除树就像children.clear()一样简单 -
一个向量需要随着它的增长而重新分配。但与分配每个节点相比,它需要的分配更少。如果您可以粗略预测节点的数量,您可以减少重新分配的需求,所以是的,可能值得对其进行测量。
-
你为什么使用
sdt::unordered_set?这是一个相当沉重和缓慢的数据结构。在最坏的情况下,每个节点可以有多少个孩子?这个数字有界吗? -
规范本身并没有讨论 heap 和 stack,它们只是创建满足要求的 c++ 实现的一种方式眼镜。在常见的实现中,默认的
new(如果没有重载或新的)和std::vector都会在堆中创建元素。 -
我认识的一位研究人员为某些模型构建巨大的树担心删除时间(=读取树以删除每个节点),他最终在不同的子进程中创建整个数据并在他完成了,操作系统正在快速清除它。不过,关于分配,它对您的问题没有帮助,但我相信您对大分配的想法可能会更有效。
标签: c++ performance containers heap-memory c++-standard-library