c++ - 堆分配与 std::vector
问题描述
我需要在代码的关键部分创建一个多树。标准方法是使用类似的东西:
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();
对于大(或巨大)树来说,它有没有可能更快?
解决方案
我猜你有一棵大小超过 1000 万个元素(或至少在 100k+ 个元素的范围内)的树来关注这个问题。
然后,这一切都取决于您的数据和树的使用方式。数据的空间性通常是值得关注的,但如果这也是你的情况,它并不明显。如果树在构建后被遍历很多次(与被修改很多次相反)并且只被修改了一点,那么尝试组织数据以使其迭代连续(std::vector
通常是这样)是有意义的。在这种情况下,您不希望有这样的指针,或者您不想使用单个元素new
/delete
肯定因为这几乎保证会让您失望(因为您不能指望在内存中连续放置的元素) -但这一切都取决于您的用例。
一个简单的方法和根本不同的方法是:
std::vector< std::pair<PathInTree, Node> > tree;
然后对其进行排序,以使Node
s 按照您迭代树的顺序出现。这是一个有点极端的解决方案,并且有一些缺点,包括如果进行大量随机插入,现在插入会变得昂贵。我也省略了如何在树中实现路径,但它通常应该是某种序列(比如在文件系统结构中)。
推荐阅读
- eclipse - Eclipse 突然显示错误,无法启动
- r - 我怎么知道一个表有多少列至少有一个值 > 或 < 一个数字?
- javascript - 是否可以单击一个按钮然后激活单击另一个按钮?
- javascript - 将文本节点附加到 div 时,set Interval 似乎只发生一次
- amazon-web-services - 如何获取 AWS 的实时终端结果-使用 SSM 执行的 EC2
- java - PDFBox - 此页面存在错误。Acrobat 可能无法正确显示页面
- python - 使用 groupby 过滤掉特定列的所有 NaN 行
- kubernetes - kubectl 通过运行以外的任何方式获取 pod 的状态和状态选项卡上的 grep
- eclipse - Eclipse:完成构建状态清理/重置
- python - pandas.DataFrame.fillna - TypeError:只有整数标量数组可以转换为标量索引